我试图同时从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 = []
答案 0 :(得分:1)
“我注意到执行速度没有增加”
在python中使用线程不会增加速度,因为它们都在同一个核心上工作。 请查看:GIL
请注意,python线程应该用于并发arquitectures而不是速度性能。
如果您希望保持此实施,请使用multiprocessing。