您不需要在线程中对文件执行write dict。也许这是个错误。
因为这是一个全局指令。你可以在所有线程都完成后执行,只需移动with open("output.pickle","wb") as j:
pickle.dump(global_dict,j)
直到文件末尾。在
您的错误是由于当一个线程将dict转储到文件时,另一个线程更改了dict,因此第一个线程将抱怨dictionary在迭代期间更改了大小
编辑1
我认为简单的解决办法是不要使用全局变量,这样就不会发生错误。
像这样:
^{pr2}$
并注意使用“ab”模式打开文件进行追加而不是替换,不要使用“wb”。在
编辑2
每次写入文件时使用锁可能会花费很大的成本。一个变通方法是每个线程写入一个不同的文件,该文件可以由进入该线程时生成的uuid命名。在
一个更快的方法是你可以进行批处理写入,并在写入时使用lock。它会比旧的方法快得多。在
样本代码:import threading
lock = threading.Lock()
def do_function():
buffer = []
while True:
r=q.get()
d={}
telephone,address=get_info(r)
d['t']=telephone
d['a']=address
buffer.append(d)
q.task_done()
if len(buffer) >= BATCH_COUNT:
lock.acquire()
with open("output.pickle","ab") as j:
pickle.dump(buffer,j)
lock.release()
buffer = []
批次数可以是1000或10000或其他你喜欢的。在