芳樽里的歌 2018-12-29 11:24 采纳率: 0%
浏览 1403

如何实现python的多个子进程对同一个变量的操作,并保存这种操作的结果?

  1. 问题描述:

假设我现在有一个python对象(pybloom模块实例化后的),名称是bf,它有一个add方法,可以向其中添加元素:bf.add(1)——说明将数字1经过一些运算添加到了bf中了。

现在问题是:我有一百万个元素需要往bf中添加,逐个添加的话,耗时较长,而我windows的CPU是4核的,因此想着创建4个python进程,分别向bf中添加元素,然然后利用pickle模块进行结构化存储,我的代码是这样的:

    from multiprocessing import Pool
    from pybloom import BloomFilter
    import pickle

    #待添加的元素列表
    L = list(range(int(1e6)))

    bf = BloomFilter(2*len(L),0.001)

    def func(i):
        bf.add(i)

    if __name__=='__main__':
        p = Pool(4)
        for i in L:
            p.apply_async(func,args=(i,))
        p.close()
        p.join()
        with open('tmp.bf','wb') as f:
            pickle.dump(bf,f)

但是由于进程间的通信问题,序列化后的bf对象再读入python中并没有达到预期的效果,即并不包含L中的一百万个数字。

求大神指教。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 14:21
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你提出的问题是一个典型的多进程并发处理任务的例子。Python本身不支持多进程的并发执行,而是通过线程来完成。在你的例子中,你可以使用multiprocessing库中的Pool类来并行运行你的函数。

    这里是一个简单的示例,演示如何使用Pool并行运行你的函数:

    import os
    import time
    from functools import partial
    from pybloom import BloomFilter
    import pickle
    
    # 创建一个Bloom Filter实例
    bf = BloomFilter(2 * len(range(1, 10 ** 5)), 0.001)
    
    def func(i):
        # 将数字i添加到Bloom Filter中
        bf.add(i)
    
    # 使用Pool并行运行你的函数
    if __name__ == '__main__':
        pool = Pool(processes=4)
        start_time = time.time()
    
        results = [pool.apply_async(func, (i,)) for i in range(len(range(1, 10 ** 5)))]
    
        end_time = time.time()
        print(f"Total time: {end_time - start_time} seconds")
    
        for result in results:
            result.get()
    
        with open('tmp.bf', 'wb') as f:
            pickle.dump(bf, f)
    

    这个程序首先创建了一个Bloom Filter实例,然后定义了一个函数func,该函数接受一个参数并将这个参数添加到Bloom Filter中。然后,我们创建了一个Pool对象,设置了进程的数量为4,然后使用apply_async方法并行运行我们的函数。最后,我们将结果写入文件,以供将来访问。

    注意,这个程序不能直接读取或修改内存中的Bloom Filter,因为Python不支持多进程并发。如果你需要修改内存中的数据,你需要使用其他技术,比如共享内存或者异步编程等。

    评论

报告相同问题?