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

时间:2018-01-03 13:49:13

标签: python-3.x multiprocessing 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*

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

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

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

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

3 个答案:

答案 0 :(得分:12)

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

要做到这一点,请转到

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

答案 1 :(得分:1)

您可以通过将函数另存为其他.py文件并将其导入到正在运行的脚本中,从而通过Spyders的IPython控制台运行它。例如,保存:

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()

答案 2 :(得分:0)

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