无法在池apply_async参数中传递共享值对象(Multiprocessing.Value('i',10))

时间:2019-09-11 12:07:25

标签: python python-multiprocessing shared-memory multiprocess

将共享值对象传递给apply_async自变量的对象将运行对象(可能被对象识别)

from Multiprocessing import Value,Pool,apply_async
val = Value('i',1)

pool = Pool(processes=2)

pool.apply_async(some_func1_accepts_argument,args=(val,))
pool.apply_async(some_func2_accepts_argumet,args=(val,))
pool.close()
pool.join()

输出:没什么

而:

from Multiprocessing import Value,Pool,apply_async
val = Value('i',1)

pool = Pool(processes=2)

pool.apply_async(some_func1_dosen't_accepts_argumet)
pool.apply_async(some_func1_dosen't_accepts_argumet)
pool.close()
pool.join()

运行正常

尝试在参数中传递字符串/ int'tuple':也可以正常运行

共享内存对象存在问题

p1=Process(target=some_func1_accepts_argument,args=(val,))
p2=Process(target=some_func2_accepts_argument,args=(val,))
p1.start()
p2.start()
p1.join()
p2.join()

在val作为共享内存对象的情况下,多处理进程可以正常运行

预期:当使用带有共享内存参数的apply_async时,应该出现两个并行过程

2 个答案:

答案 0 :(得分:0)

也许试图弄清楚是什么使您的函数崩溃?调用该函数的方式对我来说似乎是正确的,所以也许您的函数无法处理您提供的参数类型?

可能有更好的方法可以执行此操作,但可以将some_func1_accepts_argument和some_func2_accepts_argument更改为:

dist:onDemand="false"

这类似于:error_callback in multiprocessing.Pool apply_async in Python 2?

答案 1 :(得分:0)

为了利用所有核心,多处理模块提供了Pool类。 Pool类表示辅助进程池。它具有允许以几种不同方式将任务卸载到工作进程的方法。

如果在多处理中使用进程池,则为了共享对象,首先要使其成为全局对象,以便可以在计算机的每个核心中使用。请找到以下代码:

from multiprocessing import Value,Pool, Lock
import time

def some_func1_accepts_argument():
    return value

def some_func2_accepts_argument():
    return value

def init(val):
    global value
    value=val.value

if __name__=='__main__':
    val = Value('i',1)

    pool = Pool(processes=2,initializer=init, initargs=(val,))
    res=pool.apply_async(some_func1_accepts_argument)
    res1=pool.apply_async(some_func2_accepts_argument)
    print(res.get())
    print(res1.get())

Pool类中的初始化程序可使val可用于主进程派生的所有进程。