多个python线程同时写入同一列表中的不同记录 - 这样可以吗?

时间:2014-06-27 16:52:06

标签: python multithreading locking

我正在尝试修复多个线程正在写入内存列表的错误。现在我有一个线程锁定,偶尔会遇到与线程中正在进行的工作相关的问题。

我希望简单地创建一个列表哈希值,每个线程一个,并删除线程锁。似乎每个线程都可以写入自己的记录而不必担心其他线程,但也许它们都使用相同的拥有哈希这一事实本身就是一个问题。

有没有人碰巧知道这是否有效?如果没有,我可以,例如,为每个线程动态地向包添加列表吗?这基本上是一回事吗?

我远非线程专家所以欢迎任何建议。

谢谢,

2 个答案:

答案 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()

https://docs.python.org/2/library/queue.html