[英]Python Multiprocessing apply_async Only Using One Process
这是我的代码:
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个独立的进程,这些进程会提醒他们即将进入睡眠状态,然后在相似的时间醒来。
为什么这没有发生? 我已经对stackoverflow和其他站点进行了很多研究,似乎每个人都可以放心,应该在多个进程中应用“ worker”可调用对象,但事实并非如此。
您正在调用 worker
函数,因此当前进程将执行该代码, 然后将worker
的结果(即None
)传递给apply_asynch
,后者不执行任何操作。
以此方式将其更改为pool.apply_asynch(worker)
,将函数 worker
传递给执行它的子pool.apply_asynch(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
默认情况下会Pool.apply_asynch
异常。 您可以处理传递额外参数的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.