【问题标题】:No output from Process using multiprocessing使用多处理没有来自 Process 的输出
【发布时间】:2016-10-01 04:52:00
【问题描述】:

我是多处理的初学者,谁能告诉我为什么这不会产生任何输出?

import multiprocessing

def worker(num):
    """thread worker function"""

    print('Worker:', num)

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

【问题讨论】:

  • 您是以交互方式运行代码还是作为脚本运行代码(例如python myscript.py)?
  • 作为脚本运行。
  • 看来你有两个问题!一个没有调用join(),另一个是特定于IDLE 的问题。请参阅我对答案的编辑。希望这会有所帮助!

标签: python python-3.x multiprocessing python-idle python-multiprocessing


【解决方案1】:

您正在启动您的Process(),但从不等待它完成,因此您的程序执行在后台进程完成之前结束。试试这个,打电话给Process.join()

import multiprocessing
import sys

def worker(num):
    """thread worker function"""

    print('Worker:', num)
    sys.stdout.flush()

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    map(lambda p: p.join(), jobs)

这里我们使用map()jobs 列表中的每个进程调用join()

这是一个工作示例:

In [127]: %paste
import multiprocessing
import sys

def worker(num):
    """thread worker function"""

    print('Worker:', num)
    sys.stdout.flush()

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    map(lambda p: p.join(), jobs)

## -- End pasted text --
Worker: 2
Worker: 1
Worker: 0
Worker: 3

In [128]:

至于为什么这在 IDLE 中不起作用,请参阅this answer

但是,要看到print 输出,至少在 Windows 上,必须从这样的控制台启动 IDLE。

C:\Users\Terry>python -m idlelib
hello bob

(在 2.x 上使用 idlelib.idle。)原因是 IDLE 在单独的进程中运行用户代码。目前,IDLE 进程和用户代码进程之间的连接是通过套接字进行的。多处理完成的分叉不会复制或继承套接字连接。通过图标或资源管理器(在 Windows 中)启动 IDLE 时,打印输出无处可去。从带有python(而不是pythonw)的控制台启动时,输出将进入控制台,如上所述。

【讨论】:

  • 作为脚本运行,但使用 IDLE 不起作用。
  • 奇怪的事情。在 ipython 中,当我在 code without join 之后运行 code with join 时,来自 code without join 的缺失消息也会被刷新。所以这不是关于过早退出,而是关于 ipython 中的 stdout 缓存。
  • @user128751 我刚刚验证了如果您从控制台启动 IDLE,正如我在引用的文本中所说,当从 IDLE 编辑器运行时,Will 的加入工作的修订。
【解决方案2】:

您可能需要刷新输出。你可以使用sys.stdout.flush():

import multiprocessing
import sys

def worker(num):
    """thread worker function"""
    print('Worker:', num)
    sys.stdout.flush()
    return

if __name__ == '__main__':
    jobs = []
    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

【讨论】:

  • 这没有帮助!
  • 您可以尝试将它放在 for 循环中或之后 - 对我而言,它无需刷新即可工作。
  • @user128751 你是如何运行程序的?终端、解释器、IDE?
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多