没有多处理打印输出(Spyder)

新手上路,请多包涵

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

这是罪魁祸首:

 __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 似乎有一些怪癖,因为代码中的第一行已经是允许多处理工作所需的解决方法,我发现这个问题已经在 这里 讨论过了。 这里 提到了一个类似的、未解决的问题。

我将不胜感激任何帮助,并祝大家新年快乐。

原文由 J.Galt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 577
2 个回答

( _此处为 Spyder 维护者_)在 Spyder 的 IPython 控制台中,多处理在 Windows 上运行不佳。但是,您可以在外部终端中运行代码以获得所需的结果。

为此,请访问

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

_更新_:自我们的 5.2.0 版本(2021 年 11 月发布)以来,运行时生成的打印件 multiprocessing 代码被捕获并显示在所有操作系统的 IPython 控制台中。

原文由 Carlos Cordoba 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以通过 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()

原文由 HollowedOkra 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进