首页 > 解决方案 > 在 python 线程池中的线程之间共享变量

问题描述

我有这样的代码:

from multiprocessing import Pool

def do_stuff(idx):
    for i in items[idx:idx+20]:
         # do stuff with idx

items = # a huge nested list
pool = Pool(5)
pool.map(do_stuff, range(0, len(items), 20))
pool.close()
pool.join()

问题是线程池不共享items,而是为每个线程创建副本,这是一个问题,因为列表很大并且占用内存。items有没有办法以共享的方式实现这一点?global在基本库中找到了一些与该工作相关的示例,thread但这似乎不适用于multiprocessinglib。

谢谢!

标签: pythonmultithreadingpython-2.7multiprocessingthreadpool

解决方案


thread并且multiprocessing根本不能互换。

thread仍然在幕后使用全局解释器锁,因此在线程之间共享变量要容易得多,而多处理不使用 GIL,因此更容易发生冲突。

一个更好的方法是返回结果,do_stuff然后将结果一起编译。

在此处查看文档:https ://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers

在您的情况下,您应该像这样使用它:

from multiprocessing import Pool

def do_stuff(idx):
    for i in items[idx:idx+20]:
         # do stuff with idx

items = # a huge nested list
pool = Pool(5)
multiple_results = [pool.apply_async(do_stuff, i) for i in range(0, len(items), 20)]
multiple_results = [res.get(timeout=1) for res in multiple_results]

根据评论编辑:

from multiprocessing import Pool

def do_stuff(items):
    for i in items:
         # do stuff with idx

items = # a huge nested list
pool = Pool(5)
pool.map(do_stuff, [x for x in items[::20]]) #generating a list of lists of twenty items for each thread to work on
pool.close()
pool.join()

推荐阅读