在有关多处理的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
您提供它,但是它不会自动带回任何东西。
因此,当您创建Process
es时,该multiprocessing
模块会对MyClass
您创建的实例进行腌制(因为target
s是实例的绑定方法),并且每个实例都会在一个子进程中被腌制。这就是为什么每个孩子都按您期望的那样进行计算的原因。
但是,对子流程实例的版本所做的更改永远不会复制回主流程。根本没有机制可以做到这一点。最后,当子进程结束时,实例被丢弃。父进程的实例MyClass
未更新,这就是为什么您看到calculated 0
消息的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句