跨 pythons 多处理池共享对象

Sharing objects across pythons multiprocessing pool

我找不到任何关于这个问题的参考,它看起来很微不足道。

是否有可能在 multiprocessing Pool 的 Python 工作人员之间共享对象?

这是一个小例子:

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) returns 一个可迭代的对象。 "work" 怎么知道 obj_b?

是的,这是可能的,来自 doc. You can create a shared object and if set globally you can do it. See this SO 答案。

在阅读了很多 material 之后,我开始意识到一些事情:

  1. Python 不常用于多处理。
  2. 所谓的"Shared Object"可能是(我不确定,我很乐意接受纠正)是被每个进程完全复制。
  3. 有效:>

代码如下:

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

work(a)没见过obj_b,但他很清楚