繁体   English   中英

Python从另一个多重处理函数调用多重处理函数。

[英]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.

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