多个Python线程同时写入同一列表的不同记录 - 这样可以吗?
我正在尝试修复一个问题,就是多个线程同时往内存中的一个列表写数据。目前我使用了线程锁,但有时还是会遇到和线程工作相关的问题。
我希望能简单地为每个线程创建一个列表的哈希表,这样就可以去掉线程锁。这样每个线程就可以往自己的记录里写数据,而不用担心其他线程的影响。不过,可能因为它们都在使用同一个哈希表,这本身就会造成问题。
有没有人知道这样做是否可行?如果不行的话,我能不能为每个线程动态地添加一个列表到某个包里?这两者本质上是一样的吗?
我对线程方面的知识还很有限,所以任何建议都欢迎。
谢谢,
2 个回答
1
不要使用列表。应该使用队列(在python2中是Queue,在python3中是queue)。
队列有三种类型:先进先出(fifo)、后进先出(lifo)和优先级队列。最后一种是用来处理有序数据的。
你可以在一边放数据(可以用线程):
q.put(data)
然后在另一边取数据(比如在一个循环中,用于数据库):
while not q.empty:
print q.get()
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]
这样每个线程只修改自己的列表,最后再把所有的列表合在一起。
另外,正如之前提到的,这样做并不会提高性能(实际上可能比不使用线程还要慢...)你可以尝试使用多进程,这样可能会有性能提升...