在python线程池中的线程之间共享变量

时间:2018-08-16 17:31:03

标签: python multithreading python-2.7 multiprocessing threadpool

我有这样的代码:

# # 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库。

谢谢!

1 个答案:

答案 0 :(得分:1)

threadmultiprocessing完全不可互换。

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