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

标签 python multiprocessing

bloom filter 对象由 Python 模块 pybloom 创建。假设我有超过 1000 万个字符串等待添加到这个对象中,一般的方法是:

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

请原谅我糟糕的英语,如果可以的话请给我看代码。谢谢。

最佳答案

我不太熟悉 pybloomBloomFilter 对象,但快速浏览一下代码就会发现您可以联合多个BloomFilter 对象。

根据您的string_list 的大小,您可以创建一个nPool。为简单起见,假设 n=2。这里的逻辑是:对于 string_list 中的 x 个字符串 - 将其分成 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_bloomfilter 代码:

def 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

您必须为 divide_list_in_partsconcat_bf_list 添加代码。但我希望你明白逻辑。

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

关于python - 在 Python 中使用多处理时如何共享自定义变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003292/

相关文章:

python - -textvariable 选项不适用于 Python Tkinter 中的 ScrolledText 小部件

python - 在 Altair 中手动计算箱线图须线

来自读者的 Python 列表

Python:杀死 child 的子进程

java - 如何编写一个函数来并行查找大于 N 的值

python - python 的 war 卡牌游戏

python - 如何使用python发送rest API(Google Vision的API)请求?

c - thread和process id的取值范围是多少?

c++ - 分析多进程系统

Python 在线程中调用 pipe.communicate()