【问题标题】:python3.x multiprocessing cycling without "if __name__ == '__main__':"python3.x多处理循环没有“如果__name__ =='__main__':”
【发布时间】:2012-07-16 09:01:23
【问题描述】:

我有这个文件(它没有做任何有用的工作,它只是为了学习):

import multiprocessing,sys
def parent(numproc=2):
    print ('at start')
    childs=[]
    print ('bfore Pipe')
    (parentEnd,childEnd)=multiprocessing.Pipe()
    i=0
    print ('printing i:',i)
    child=multiprocessing.Process(target=child_proc, args=(childEnd,i))
    print ('created child')
    child.start()
    print ('started child')
    print ('joining child')
    child.join()
    print ('joined child')
    print ('exeted from for i in childs')
    mins=[1,2]
    print ('task ended. result: ',min(mins))
def child_proc(pipe,name):
    pass
if __name__ == '__main__':
    parent()

以这种形式完美运行:

at start
bfore Pipe
printing i: 0
created child
started child
joining child
joined child
exeted from for i in childs
task ended. result:  1

但如果我放在文件末尾而不是

if __name__ == '__main__':
    parent()

只有

parent()

它属于循环...

at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
Traceback (most recent call last):

为什么?!这个 if 子句有什么不同?

【问题讨论】:

标签: python python-3.x multiprocessing


【解决方案1】:

这是 MS Windows 上 multiprocessing 的问题:主模块由子任务导入,因此任何不受 if __name__ . . . 子句保护的代码都会再次运行,从而导致无限循环。

【讨论】:

    【解决方案2】:

    子进程有以下__name____parents_main__,不再有__main__。这就是为什么您在测试__name__ 变量时进程不会循环的原因。

    有关这方面的更多信息,请查看章节Safe importing of main module

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 1970-01-01
      • 2023-03-19
      • 2018-03-13
      • 2020-06-05
      • 2015-09-12
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多