多处理代码重复运行

2022-02-26 00:00:00 python multiprocessing runtime-error

问题描述

所以我希望使用python多处理模块创建一个进程,我希望它是一个更大的脚本的一部分。(我还想从中得到很多其他东西,但现在我将满足于此)

我从multiprocessing docs复制了最基本的代码,并对其稍作修改

但是,if __name__ == '__main__':语句之外的所有内容在每次调用p.join()时都会重复。

这是我的代码:

from multiprocessing import Process

data = 'The Data'
print(data)

# worker function definition
def f(p_num):
    print('Doing Process: {}'.format(p_num))

print('start of name == main ')

if __name__ == '__main__':
    print('Creating process')
    p = Process(target=f, args=(data,))
    print('Process made')
    p.start()
    print('process started')
    p.join()
    print('process joined')

print('script finished')

这就是我所期望的:

The Data
start of name == main 
Creating process
Process made
process started
Doing Process: The Data
process joined
script finished

Process finished with exit code 0

这就是现实:

The Data
start of name == main 
Creating process
Process made
process started
The Data                         <- wrongly repeated line
start of name == main            <- wrongly repeated line
script finished                  <- wrongly executed early line
Doing Process: The Data
process joined
script finished

Process finished with exit code 0

我不确定这是由if语句或p.join()或其他原因引起的,也不确定为什么会发生。请找个人解释一下是什么原因是什么原因以及为什么?

为了清楚起见,因为有些人无法复制我的问题,但我做到了;我使用的是Windows Server 2012 R2 Datacenter,而我使用的是Python 3.5.3。

Python

Multiprocessing在推荐答案中的工作方式是每个子进程导入父脚本。在Python中,当您导入脚本时,将执行函数中未定义的所有内容。据我所知,__name__在脚本导入时更改(Check this SO answer here for a better understanding),这与直接在命令行上运行脚本不同,这将导致__name__ == '__main__'。此导入会导致__name__不等于'__main__',这就是if __name__ == '__main__':中的代码不会为子流程执行的原因。

您不希望在子进程调用期间执行的任何内容都应移到代码的if __name__ == '__main__':部分中,因为这将仅对父进程(即您最初运行的脚本)运行。

希望这会有一点帮助。如果你环顾四周,谷歌周围有更多的资源可以更好地解释这一点。我链接了多处理模块的官方Python资源,建议您浏览一下。

相关文章