【问题标题】:No multiprocessing print outputs (Spyder)没有多处理打印输出 (Spyder)
【发布时间】:2018-06-13 04:58:10
【问题描述】:

我最近开始研究多处理,因为我相信我的代码可以很容易地并行化。但是,在完成教程后,我遇到了一个问题:分布在池中的函数似乎无法打印。

这是罪魁祸首:

__spec__ = None # This line is required for Spyder and not part of the actual example

from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

我收到的输出如下:

main line 
module name: __main__ 
parent process: 10812 
process id: 11348*

现在很明显,控制台似乎只打印 info 函数,而不是 f 函数(使用 multiprocessing.Process)的任何输出。我在网上找到的其他示例也遇到过类似的问题:使用多处理时计算已完成并正确返回,但控制台中从未出现打印。

有人知道为什么以及如何解决这个问题吗?

在可能相关的说明中,我在 Spyder 3.2.4 中使用 Python 3.6。 Spyder 似乎有一些怪癖,因为代码中的第一行已经是允许多处理工作所需的解决方法,我发现这个问题已经讨论过here。提到了一个类似的未解决问题here

感谢任何帮助,祝大家新年快乐。

【问题讨论】:

  • 在 linux 上它确实打印出f 中的内容。你在哪个操作系统上?
  • 哦,你如何启动脚本? spyder我不知道,但是可能你直接在命令行调用脚本会得到不同的结果?
  • 多处理在 Spyder 的 Windows 上不能正常工作,抱歉。您可以在外部终端中运行代码以获得所需的结果。为此,请转至Run > Configuration per file > Execute in an external system terminal
  • 解决方案解释here:Spyder 似乎重定向stdout,在linux 上,一个分叉的进程从父进程继承stdout,在windows 中似乎不是这样,输出是在“默认标准输出”上完成,因此不会进入 spyder 控制台
  • 非常感谢! hansaplast 的链接似乎解释了问题的根源,而 Carlos Cordoba 的建议显示了一种潜在的解决方法。

标签: python-3.x multiprocessing spyder


【解决方案1】:

此处是 Spyder 维护者)在 Spyder 的 IPython 控制台中,多处理在 Windows 上无法正常工作。但是,您可以在外部终端中运行您的代码以获得您想要的结果。

要这样做,请转到

Run > Configuration per file > Execute in an external system terminal

【讨论】:

  • 嗨,Carlos,感谢您的救命之恩。这在最新版本的 Spyder 中是否已修复?当你说多处理不能很好地工作时,你的意思是它在与 Spyder 一起使用时会产生错误?或者这只是一个使用您的技巧解决的打印问题?谢谢!!
  • 在 Windows 上使用多处理进行打印无法按预期工作。
  • 任何消息为什么会发生这种情况?在 v4.0 中没有修复?
  • 似乎没有在版本 4 中修复:/
  • 如何通过以这种方式运行代码来调试代码(在外部终端中)?
【解决方案2】:

您可以通过 Spyders 的 IPython 控制台运行它,方法是将函数保存为不同的 .py 文件并将其导入您正在运行的脚本中。例如保存:

def f(name):
    info('function f')
    print('hello', name)

在一个名为 worker.py 的文件中。然后在你的主文件中,执行以下操作:

from multiprocessing import Process
import os
import worker

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

if __name__ == '__main__':
    info('main line')
    p = Process(target=worker.f, args=('bob',))
    p.start()
    p.join()

【讨论】:

  • 这在我的系统上不起作用。另外,我相信worker.py文件需要定义/导入“信息”函数。
【解决方案3】:

您可以改用日志文件。使用 fp.write()

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2021-05-13
    • 2020-06-07
    • 2022-01-03
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多