[多处理python]:无输出

[多处理python]:无输出,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,有人能解释一下为什么当我试图执行下面的例子时,我没有结果。 我还试图重定向文件中的输出,但没有成功 from multiprocessing import Process def proc(i): print(f'I am Process {i}') if __name__ == '__main__': for i in range(10): Process(target=proc, args=(i,)).start() 通常情况下,我有以下输出: I am

有人能解释一下为什么当我试图执行下面的例子时,我没有结果。 我还试图重定向文件中的输出,但没有成功

from multiprocessing import Process
def proc(i):
    print(f'I am Process {i}')
if __name__ ==  '__main__':
    for i in range(10):
        Process(target=proc, args=(i,)).start()
通常情况下,我有以下输出:

I am Process 6
I am Process 2
I am Process 0
I am Process 3
I am Process 7
I am Process 4
I am Process 8
I am Process 1
I am Process 5
I am Process 9

但在我的情况下,我没有结果。

您需要强制刷新,否则只有在缓冲区已满时,输出才会可见:

def proc(i):
    print(f'I am Process {i}')
    sys.stdout.flush()


PS:在检查
\uuuu name\uuuuuu
时,您也有一个输入错误。如果

中缺少下划线,则在
中可能是打字错误

运行:

from multiprocessing import Process

def proc(i):
    print(f'I am Process {i}')

if __name__ == '__main__':
    for i in range(10):
        Process(target=proc, args=(i,)).start()

在我的机器上返回正确的输出

如果您必须在笔记本下运行(并已根据需要将辅助功能移动到外部模块),并且希望在笔记本内查看打印输出,则需要安排由主(启动)进程完成打印。这意味着启动的进程需要将要打印的字符串返回到启动进程。有几种方法可以做到这一点。在这里,我使用了一个带有回调函数的多处理池,这样一旦结果就绪,就会用结果回调主进程:

来自多处理导入池的

从工人进口程序
完成时的def(结果):
打印(结果)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
游泳池=游泳池(10)
结果=[pool.apply\u async(proc,args=(i,),callback=完成时)用于范围(10)中的i]
pool.close()
pool.join()#等待工作进程退出
第二种更简单的方法:

来自多处理导入池的

从工人进口程序
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
游泳池=游泳池(10)
结果=池。imap_无序(过程,范围(10))
#在结果可用时打印它们:
对于结果中的结果:
打印(结果)
使用ProcessPoolExecutor:

来自concurrent.futures导入ProcessPoolExecutor的
,已完成
从工人进口程序
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
以ProcessPoolExecutor(最大工作人员数=10)作为执行者:
期货=[范围(10)内i的执行人提交(proc,i)]
对于已完成的f(期货):
打印(f.result())

我会像你说的那样尝试强制刷新,因为即使我删除if name并在jupyter中尝试代码,也没有输出。我尝试一下,但也一样problem@Ishraq如何执行python程序?我用Jupyter执行这部分代码非常感谢您所提到的文章。这个回答帮助了我:对不起,不是这个问题,只是我在这里写代码时出错了。尽管我写得正确,但我没有结果将i设置在范围(150)内并在task manager中检查您的cpu活动,以检查是否确实创建了进程。是的,当我在task manager中检查我的cpu活动时,我观察到正在创建进程,但在spyder或Jupyter中未得到任何结果。您已编辑您的问题以更正错误,但未表明您已这样做。人们会来看看这个,现在想知道为什么你没有从一个正确的程序中得到输出。我没有纠正错误。(只是我在stackoverflow中写代码时出错了,在if`uu name_uuu`和if`u name_u `,我写的不是我的问题。如果是这样的话,我应该得到一个NameError:name'name'没有定义)但我的问题是:尽管代码是正确的,但我始终存在相同的问题,即在我的情况下,多重处理不起作用,并且我没有输出。谢谢你的回复,很高兴你澄清了这一点。根据你的打字错误已经有了答案。请看下面我的答案。好的,谢谢。谢谢你的回答。是的,手机下面没有任何东西,但请告诉我如何访问笔记本电脑控制台为什么你必须在笔记本电脑下运行此操作?您不能在Windows/Linux命令提示符下运行这个(或您的原始代码)吗?。但是如果你必须在笔记本电脑下运行,我已经更新了我的答案。好的,谢谢你,这对我有效:D如果可能的话,我想取消重新启动,原因是因为我将尝试在spyder中实现解决方案,这也是同样的问题。老实说,我不知道笔记本电脑为什么会这样工作。我的猜测是,它捕获写入标准输出的输出,然后将其写入单元格下。但它只对单元中运行的进程执行此操作,而不对它创建的任何子进程执行此操作。您应该仔细阅读多处理池。Python提供了两个类来实现这一点,模块
多处理中的class
Pool
和模块
concurrent.futures中的class
ProcessPoolExecutor
。我将使用
ProcessPoolExecutor
添加一个示例