繁体   English   中英

在类中调用函数而不是在Python中使用多重处理

[英]Calling a function within a class instead of function using multiprocessing in Python

有关多处理的Python 文档中,有许多并行化函数工作的示例。 我认为也可以对一个类中包含的函数执行此操作。 但是,以下示例不起作用。 它产生用于计算当前进程号的2的乘积的进程。 报告对象内部的计算值是可行的,但是当我在作业完成后尝试获取计算值时,它只会报告构造函数中设置的值。

类定义

import multiprocessing


class MyClass():

    def __init__(self,runname):
        self.runname = runname
        self.output = 0



    def calculate(self,input):
        self.output = input*2
        print "Reporting from runname %s, calculation yielded %s" % (self.runname,self.output)


    def getOutput(self):
        return self.output

调用对象的代码:

objectList = [] #Store objects
jobList = [] #Store multiprocessing objects

#Run the workers in  4 parallel processes
for i in range(4):

    thisRunname = 'Worker:%s' % i
    thisInstance = MyClass(thisRunname)

    p = multiprocessing.Process(target=thisInstance.calculate, args=(i,))

    jobList.append(p)
    p.start()
    objectList.append(thisInstance)

for thisJob in jobList: #Wait till all jobs are done
    thisJob.join()

print "Jobs finished"

for thisInstance in objectList:
    print "Worker %s calculated %s " % (thisInstance.runname,thisInstance.getOutput() )

输出:

Reporting from runname Worker:0, calculation yielded 0
Reporting from runname Worker:1, calculation yielded 2
Reporting from runname Worker:2, calculation yielded 4
Reporting from runname Worker:3, calculation yielded 6
Jobs finished
Worker Worker:0 calculated 0
Worker Worker:1 calculated 0
Worker Worker:2 calculated 0
Worker Worker:3 calculated 0

因此,可以毫无问题地生成calculate函数,当尝试检索计算出的值时,它只返回0(即在构造函数中设置的值)。

我是否缺少一个关键概念,如何获得self.output值?

Process类提供的序列化只是单向的。 它会序列化target和您提供的args ,但不会自动带回任何东西。

因此,当您创建Processmultiprocessing模块MyClass您创建的MyClass实例进行腌制(因为target是实例的绑定方法),并且每个子流程都会在一个子进程中被腌制。 这就是为什么每个孩子都按照您的期望进行计算的原因。

但是,对子进程的实例版本所做的更改永远不会复制回主进程。 根本没有机制可以做到这一点。 最后,当子进程结束时,实例被丢弃。 父进程的MyClass实例未更新,这就是为什么您看到calculated 0消息的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM