在Python中使用多重处理时如何共享自定义变量?

时间:2019-01-02 08:30:25

标签: python multiprocessing

有一个由Python模块pybloom创建的 bloom过滤器对象。假设我有超过一千万个字符串在等待 add 到该对象中,并且这样做的一般方法是:

from pybloom import BloomFilter

# initialize a bloomfilter object
bf = BloomFilter(int(2e7)) 

for i in string_list:
    bf.add(i)

但是,这特别浪费了string_list太长的时间。由于我的计算机(windows7)是4核CPU,因此我想知道是否存在一种多进程方法来充分利用CPU并快速实现add方法。

我对multiprocessing有所了解,但是我无法解决在进程之间交换自定义对象(例如上面的bf)的问题。

请原谅我可怜的英语,如果可以的话,请告诉我代码。谢谢。

1 个答案:

答案 0 :(得分:0)

我对pybloomBloomFilter对象不是很熟悉,但是快速浏览一下代码可以发现您可以union多个BloomFilter对象。

根据您的string_list的大小,您可以创建Pool的{​​{1}}。为简单起见,请说n。这里的逻辑是:例如,假设n=2中的x个字符串-将其分成大小分别为string_list的{​​{1}}个列表。然后创建一个单独的过程来处理这些问题。

你可以有这样的东西:

2

x/2的代码:

from multiprocessing import Pool
with Pool(n) as p:
    bloom_filter_parts = p.map(add_str_to_bloomfilter, divide_list_in_parts(string_list))
    # Now you have a list of BloomFilter objects with parts of string_list in them, concatenate them
    res_bloom_filter=concat_bf_list(bloom_filter_parts)

您必须为add_str_to_bloomfilterdef add_str_to_bloomfilter(str_list_slice): res_bf = BloomFilter(capacity=100) for i in str_list_slice: res_bf.add(i) return res_bf 添加代码。但我希望您能理解。

另外,请阅读:https://docs.python.org/3.4/library/multiprocessing.html