繁体   English   中英

Python多处理apply_async仅使用一个进程

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

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