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

标签 python multiprocessing

这是我的代码:

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/

相关文章:

python - 多处理 python 2.6 的问题

c - 如何yield一个fork()创建的子进程,让其他子进程有机会运行?

python - 计算 CNN 层数

python - 在 Python 中编码 JSON 时如何更改数据类型

python - 多处理与 gevent

具有进程和池的 Python 生产者/消费者

c - GNU C 使用管道的多进程处理

python - 如何将wav文件转换为浮点幅度

python - matplotlib 循环绘图,删除颜色条但保留空白

python - 无法使用 easy_install 安装 pip