我有这样的代码:
# # A tibble: 8 x 3
# # Groups: user_id [2]
# user_id type total
# <int> <chr> <dbl>
# 1 1 1 150
# 2 1 2 200
# 3 1 3 0
# 4 1 4 0
# 5 2 1 0
# 6 2 2 0
# 7 2 3 0
# 8 2 4 30
问题在于线程池不共享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
库。
谢谢!
答案 0 :(得分:1)
thread
和multiprocessing
完全不可互换。
thread
仍然在后台使用“全局解释器锁定”,因此在线程之间共享变量要容易得多,而多处理不使用GIL,因此容易发生冲突。
一种更好的方法是返回do_stuff
的结果,然后将结果汇总在一起。
在此处查看文档:{{3}}
在您的情况下,您应该像这样使用它:
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()