这是我的代码:
import multiprocessing
import time
import os
def worker():
print str(os.getpid()) + " is going to sleep..."
time.sleep(1)
print str(os.getpid()) + " woke up!"
return
if __name__ == "__main__":
pool = multiprocessing.Pool(processes = 8)
for _ in range(5):
pool.apply_async(worker())
我的输出:
23173 is going to sleep...
23173 woke up!
23173 is going to sleep...
23173 woke up!
23173 is going to sleep...
23173 woke up!
23173 is going to sleep...
23173 woke up!
23173 is going to sleep...
23173 woke up!
该输出按顺序出现,显然所有输出都具有相同的 id。我期望看到的是 5 个独立的进程,警告它们将要 sleep ,然后在相似的时间醒来。
为什么这没有发生?我在 stackoverflow 和其他网站上做了很多研究,似乎每个人都确信这应该跨多个进程应用“worker”可调用,但事实似乎并非如此。
最佳答案
您正在调用worker
函数,因此当前进程执行该代码,然后执行结果worker
(即None
)被传递给apply_asynch
,它不执行任何操作。
将其更改为 pool.apply_asynch(worker)
通过这种方式,函数 worker
被传递给执行它的子进程。
明确地说,问题在于这之间的区别:
>>> def worker():
... print('Hi there!')
...
>>> def f(func):
... print('Received', func)
... func()
...
>>> f(worker())
Hi there!
Received None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in f
TypeError: 'NoneType' object is not callable
还有这个:
>>> f(worker)
Received <function worker at 0x7f5cd546f048>
Hi there!
请注意,前者的行顺序错误并产生 TypeError
。
不幸的是,Pool.apply_asynch 默认情况下会静默异常。不过,您可以处理传递额外参数的错误。
关于Python 多处理 apply_async 仅使用一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644254/