多处理代码重复运行
问题描述
所以我希望使用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资源,建议您浏览一下。
相关文章