跨 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 之后,我开始意识到一些事情:
- Python 不常用于多处理。
- 所谓的"Shared Object"可能是(我不确定,我很乐意接受纠正)是被每个进程完全复制。
- 有效:>
代码如下:
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,但他很清楚
我找不到任何关于这个问题的参考,它看起来很微不足道。
是否有可能在 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 之后,我开始意识到一些事情:
- Python 不常用于多处理。
- 所谓的"Shared Object"可能是(我不确定,我很乐意接受纠正)是被每个进程完全复制。
- 有效:>
代码如下:
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,但他很清楚