在pythons多处理池中共享对象

时间:2018-01-21 16:57:33

标签: python python-multiprocessing

我无法找到对这个问题的任何提及,这似乎是微不足道的。

甚至可以在multiprocessing Pool之间的Pythons工作者之间共享对象吗?

这是一个小例子:

from multiprocessing import Pool

def work(a):
    return do_work(obj_b)

def main(obj_a, obj_b):
    my_iterable = get_iter(obj_a)
    p = Pool(processes=6)
    res = p.map(work, my_iterable)

让我们说get_iter(obj_a)返回一个可迭代对象。 "work"如何知道obj_b?

2 个答案:

答案 0 :(得分:1)

是的,可以从doc开始。您可以创建共享对象,如果全局设置,则可以执行此操作。请参阅this SO回答。

答案 1 :(得分:1)

在阅读了很多材料之后,我意识到了一些事情:

  1. Python并不常用于多处理。
  2. 所谓的"共享对象" 可能是(而且我不确定,我很乐意经过纠正)正在被每个流程完全复制。
  3. 有效:>
  4. 下面是代码:

    from multiprocessing import Pool, cpu_count
    
    def work(a):
        print("I'm aware of obj_b: {}".format(obj_b))
    
    def initPoolResources(_obj_b):
        # Define all your shared read obj here
        global obj_b 
        # Initialize them
        obj_b = _obj_b
    
    def main(obj_a):
        # Assume obj_a is an iterable object
        # We want to create a "shared read only" object between the pool of processes. 
        p = Pool(processes=cpu_count()-1, initializer=initPoolResources, initargs(obj_b))
        result = p.map(work, obj_a)
        p.close()
        p.join()
    

    工作(a)从未见过obj_b,但他完全了解它。