gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:29:10 26 4
gpt4 key购买 nike

考虑以下多处理 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,如 post 中的建议。 。但现在它导致了僵尸进程的创建。从另一个池函数调用一个池函数的正确方法是什么?这个设计有缺陷吗?我使用的是 python 2.6。

最佳答案

简单答案:multiprocessing 不允许您执行此操作,因为它会将内部进程作为守护进程孤立,正如错误所述。您可以解决它(我指的是旧版本的 processing,它允许这样做,并且在我的包 pathos 中 fork )。但是,如果您解决这个问题,则必须手动终止守护进程,所以这确实不值得。

通常,您会遇到这样的情况:您需要嵌套的map,并且较低级别的作业是“重”而较高级别的作业是“轻”......或类似的情况。一项工作是工作的“肉”,另一项工作只是分配底层工作。对于这种情况,您可以使用两种不同类型的

例如线程和进程。我使用我的 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]]

关于Python 从另一个多处理函数调用一个多处理函数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com