我正在尝试修复多个线程正在写入内存列表的错误。现在我有一个线程锁定,偶尔会遇到与线程中正在进行的工作相关的问题。
我希望简单地创建一个列表哈希值,每个线程一个,并删除线程锁。似乎每个线程都可以写入自己的记录而不必担心其他线程,但也许它们都使用相同的拥有哈希这一事实本身就是一个问题。
有没有人碰巧知道这是否有效?如果没有,我可以,例如,为每个线程动态地向包添加列表吗?这基本上是一回事吗?
我远非线程专家所以欢迎任何建议。
谢谢,
答案 0 :(得分:0)
import threading
def job(root_folder,my_list):
for current,files,dirs in os.walk(root):
my_list.extend(files)
time.sleep(1)
my_lists = [[],[],[]]
my_folders = ["C:\\Windows","C:\\Users","C:\\Temp"]
my_threads = []
for folder,a_list in zip(my_folders,my_lists):
my_threads.append(threading.Thread(target=job,args=(folder,a_list)
for thread in my_threads:
thread.start()
for thread in my_threads:
thread.join()
my_full_list = my_lists[0] + my_lists[1] + my_lists[2]
这样每个线程只修改自己的列表,最后组合所有单独的列表
同样指出这会带来零性能增益(实际上可能比没有线程化更慢......)你可以使用多处理来获得性能提升......
答案 1 :(得分:0)
不要使用列表。使用队列(python2)或队列(python3)。 队列有3种:fifo,lifo和priority。最后一个是有序数据。
您可以将数据放在一边(带线程):
q.put(data)
然后到另一边(也许是在数据库的循环中):
while not q.empty:
print q.get()