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

0 投票
2 回答
2281 浏览
提问于 2025-04-18 11:21

我正在尝试修复一个问题,就是多个线程同时往内存中的一个列表写数据。目前我使用了线程锁,但有时还是会遇到和线程工作相关的问题。

我希望能简单地为每个线程创建一个列表的哈希表,这样就可以去掉线程锁。这样每个线程就可以往自己的记录里写数据,而不用担心其他线程的影响。不过,可能因为它们都在使用同一个哈希表,这本身就会造成问题。

有没有人知道这样做是否可行?如果不行的话,我能不能为每个线程动态地添加一个列表到某个包里?这两者本质上是一样的吗?

我对线程方面的知识还很有限,所以任何建议都欢迎。

谢谢,

2 个回答

1

不要使用列表。应该使用队列(在python2中是Queue,在python3中是queue)。

队列有三种类型:先进先出(fifo)、后进先出(lifo)和优先级队列。最后一种是用来处理有序数据的。

你可以在一边放数据(可以用线程):

q.put(data)

然后在另一边取数据(比如在一个循环中,用于数据库):

while not q.empty:
    print q.get()

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

1
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]

这样每个线程只修改自己的列表,最后再把所有的列表合在一起。

另外,正如之前提到的,这样做并不会提高性能(实际上可能比不使用线程还要慢...)你可以尝试使用多进程,这样可能会有性能提升...

撰写回答