关于python 3.x:没有多处理打印输出(Spyder)

No multiprocessing print outputs (Spyder)

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

这是罪魁祸首:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__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()

我收到的输出如下:

1
2
3
4
main line
module name: __main__
parent process: 10812
process id: 11348*

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

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

可能相关的注释是,我在Spyder 3.2.4中使用Python 3.6。 Spyder似乎有一些古怪之处,因为代码的第一行已经是解决问题的方法,它允许多处理工作,这是我在这里已经讨论的一个问题。这里提到了一个类似的未解决的问题。

我将不胜感激,也祝大家新年快乐。


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

为此,请转到

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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()


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