我最近开始深入研究多处理,因为我相信我的代码可以很容易地并行化。但是,在完成教程时,我遇到了一个问题:分布在池中的函数似乎无法打印。
这是罪魁祸首:
__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 函数的任何输出(它使用多处理。过程)。我在网上找到的其他示例中也遇到了类似的问题:使用多处理时计算完成并正确返回,但打印永远不会显示在控制台中。
有谁知道为什么,以及如何解决这个问题?
在一个可能相关的说明中,我在Spyder 3.2.4中使用Python 3.6。Spyder似乎有一些怪癖,因为代码中的第一行已经是允许多处理工作所需的解决方法,我发现这个问题已经在这里讨论过了。这里提到了一个类似的未解决的问题。
我将不胜感激任何帮助,并祝大家新年快乐。
(Spyder维护者在这里)多处理在Spyder的IPython控制台的Windows上不能很好地工作。但是,您可以在外部终端中运行代码以获得所需的结果。
为此,请转到
Run > Configuration per file > Execute in an external system terminal
.
更新:自我们的5.2.0版本(2021 年 11 月发布)以来,运行multiprocessing
代码时生成的打印将被捕获并显示在所有操作系统的 IPython 控制台中。
您可以通过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()
你可以改用日志文件。 使用 fp.write()