在 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的方式实现这一点?找到了一些在基本thread库中工作的global示例,但似乎不适用于multiprocessing库。

谢谢!

threadmultiprocessing根本不能互换。

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

相关内容

  • 没有找到相关文章

最新更新