test1.py/myfunc1((并行执行一些工作。
如果我从test2.py调用myfunc1((,它会很好地工作(目前已被注释掉(。
如果我在test2.py中创建另一个池并从中调用myfunc1((;pool=mp.pool(5(";线
result={type}<类"断言错误">args={getset_descriptor}<"BaseException"对象的特性"args">
如何解决此问题?
test1.py
import time
import multiprocessing as mp
def worker(a):
print("Worker: "+str(a))
time.sleep(5)
return a
def mycallback(val ):
print("Callback: "+str(val))
def myfunc1(n=3):
print("start myfunc1")
slist = range(n)
pool = mp.Pool(5)
[pool.apply_async(worker,args=(s,), callback=mycallback) for s in slist]
pool.close()
pool.join()
if __name__ == "__main__":
myfunc1()
test2.py
from pythonProjectTEST.test1 import myfunc1
import multiprocessing as mp
def mycallback(val ):
print("CallbackMaster: "+str(val))
if __name__ == "__main__":
# This works
#myfunc1(5)
# This does not
slist = range(6)
pool = mp.Pool(3)
[pool.apply_async(myfunc1,args=(s,), callback=mycallback) for s in slist]
pool.close()
pool.join()
不允许从另一个守护进程派生守护进程。注意test2
的main如何派生进程以调用myfunc1
,然后myfunc1
如何派生进程来调用worker
。我怀疑这种限制是为了减少分叉炸弹或死锁的机会。如果你真的想这样做,有一些变通办法:Python进程池非守护进程?。不过,如果可能的话,我会尽量避免。
要调试这样的问题,添加错误回调通常很方便。例如,下面的代码为您提供了一条有用的错误消息";错误:守护进程不允许有子进程":
def errorcallback(val):
print("Error: %s" % str(val))
...
[pool.apply_async(myfunc1,args=(s,), callback=mycallback, error_callback=errorcallback ) for s in slist]
方法apply_async
通常会出现错误,除非您指定error_calblack(请参阅此处的文档(。方括号中的参数是可选的,但您可以使用指定的名称逐个添加它们。
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
"如果指定了error_callback,那么它应该是一个接受单个参数的可调用函数。如果目标函数失败,则会使用异常实例调用error_callback">