【问题标题】:Multiple python threads writing to different records in same list simultaneously - is this ok?多个 python 线程同时写入同一列表中的不同记录 - 可以吗?
【发布时间】:2014-06-27 16:52:06
【问题描述】:

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

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

有没有人碰巧知道这是否可行?如果没有,例如,我可以为每个线程动态添加一个列表到包中吗?这本质上是一样的吗?

我远不是线程专家,所以欢迎任何建议。

谢谢,

【问题讨论】:

  • 几乎肯定不是....只是基于标题
  • 请注意,在 Python 中,多线程对 I/O 性能很有用,但对 CPU 没有帮助。

标签: python multithreading locking


【解决方案1】:

不要使用列表。使用队列 (python2) 或队列 (python3)。 队列有 3 种:fifo、lifo 和优先级。最后一个用于有序数据。

您可以将数据放在一侧(带线程):

q.put(data)

然后到达另一边(也许在一个循环中,比如数据库):

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

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

【讨论】:

    【解决方案2】:
    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]
    

    这样每个线程只修改自己的列表,最后合并所有单独的列表

    也正如指出的那样,这给出了零性能增益(实际上可能比不线程化它要慢...)您可能会使用多处理来获得性能增益...

    【讨论】:

    • 您好,感谢您的回答。在我看来, my_list 是线程本地的,会使它们分开。很酷。如果您有时间,您是否可以编辑以包含有关定期从主线程访问每个线程的本地 my_list 的任何注意事项的评论。换句话说,我的线程将运行很长时间来收集我想要不时复制的数据。我是否只是将线程锁放在还包含 job() 的类中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多