多线程访问python字典

时间:2016-03-07 09:49:22

标签: python multithreading dictionary

我试图同时从python中的不同线程访问相同的全局字典。访问点的线程安全对我来说不是一个安慰,因为所有访问都是读取而不是修改字典。 我改变了我的代码来从多个线程进行访问,但是我注意到执行速度没有增加,在检查了arround后,似乎解释器序列化了访问,实际上使我的代码中的更改为null。

有没有一种简单的方法可以在python中拥有类似Java的concurrentHashMap的结构? 有问题的代码部分如下:

    class csvThread (threading.Thread):
        def __init__(self, threadID, bizName):
            threading.Thread.__init__(self)
            self.threadID = threadID
            self.bizName = bizName
        def run(self):
            thread_function(self.bizName)



    def thread_function(biz):
        first = True
        bizTempImgMap = {}
        for imag in bizMap[biz]:
            if not similar(bizTempImgMap, imgMap[imag]):
                bizTempImgMap[imag] = imgMap[imag]
                if first:
                    a = imgMap[imag]
                    sum = a
                else:
                    c = np.column_stack((a, imgMap[imag]))
                    sum += imgMap[imag]
                    a = c.max(1) #max
                first = False
            else:
                print ("-")
        csvLock.acquire()
        writer.writerow([biz]+a.astype(np.str_).tolist()+(np.true_divide(sum, len(bizTempImgMap.keys()))).tolist())
        csvLock.release()


csvLock = threading.Lock()
...
imgMap = img_vector_load('test_photos.csv')
bizMap = img_busyness_load('csv/test_photo_to_biz_ids.csv')
...
for biz in bizMap.keys():
    if len(threads)<100:
        thread = csvThread(len(threads), biz)
        threads.append(thread)
        thread.start()
    else:
        print("\nWaiting for threads to finish\n")
        for t in threads:
            t.join()
        print("\nThreads Finished\n")
        threads = []

1 个答案:

答案 0 :(得分:1)

  

“我注意到执行速度没有增加”

在python中使用线程不会增加速度,因为它们都在同一个核心上工作。 请查看:GIL

请注意,python线程应该用于并发arquitectures而不是速度性能。

如果您希望保持此实施,请使用multiprocessing