我有这样的代码:
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
库。
谢谢!
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()