[英]Python call a multiprocessing function from another multiprocessing function.
考虑以下多处理python程序:
import multiprocessing as mp
from math import sqrt
def funcA(mylist):
worker_poolA = mp.Pool()
jobs = mylist
results = worker_poolA.map(sqrt, jobs)
worker_poolA.close()
worker_poolA.join()
return results
def funcB():
worker_poolB = mp.Pool()
jobs = [[0, 1, 4, 9, 16, 25],[25, 4, 16, 0,1]]
finalresults = worker_poolB.map(funcA, jobs)
worker_poolB.close()
worker_poolB.join()
print finalresults
def funcC():
jobs = [[0, 1, 4, 9, 16, 25],[25, 4, 16, 0,1]]
for job in jobs:
print funcA(job)
if __name__ == "__main__":
funcC() #works fine
funcB() #ERROR: AssertionError: daemonic processes are not allowed to have children
为了克服这个问题,我再划分子类multiprocesing.pool.Pool模块,并设置守护标志为False在此建议后 。 但是现在它导致了僵尸进程的产生。 从另一个池函数调用池函数的正确方法是什么? 这个设计有缺陷吗? 我正在使用python 2.6。
简单的答案: multiprocessing
不允许您执行此操作,因为它会将内部进程孤立为守护程序,就像错误所说的那样。 您可以解决它(我指的是更旧版本的processing
,它允许这样做,并在我的package pathos
中分叉了)。 但是,如果您要解决此问题,则必须手动终止守护程序进程,因此这确实不值得。
通常,您会遇到需要嵌套map
,而较低级别的工作是“重”,而较高级别的工作是“轻”……等等。 一种工作是工作的“肉”,另一种工作只是分配基础工作。 对于这种情况,可以使用两种不同类型的pool
。
例如,线程和进程。 我正在使用我的fork(称为multiprocess
),只是因为它在解释器中更容易使用-但在这种特殊情况下与multiprocessing
相同。
>>> import multiprocess as mp
>>> from math import sqrt
>>>
>>> def funcA(mylist):
... worker_poolA = mp.Pool()
... jobs = mylist
... results = worker_poolA.map(sqrt, jobs)
... worker_poolA.close()
... worker_poolA.join()
... return results
...
>>> def funcB():
... worker_poolB = mp.dummy.Pool()
... jobs = [[0, 1, 4, 9, 16, 25],[25, 4, 16, 0,1]]
... finalresults = worker_poolB.map(funcA, jobs)
... worker_poolB.close()
... worker_poolB.join()
... print finalresults
...
>>> def funcC():
... jobs = [[0, 1, 4, 9, 16, 25],[25, 4, 16, 0,1]]
... for job in jobs:
... print funcA(job)
...
>>> funcC()
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
[5.0, 2.0, 4.0, 0.0, 1.0]
>>> funcB()
[[0.0, 1.0, 2.0, 3.0, 4.0, 5.0], [5.0, 2.0, 4.0, 0.0, 1.0]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.