假设我有两个函数
def funct1():
##does something
def funct2():
##does something
我想在另一个多处理功能中使用它们,比如
def my_funct
##does something
if __name__ == '__main__':
p1 = Process(target = funct1)
p2 = Process(target = funct2)
p1.start()
p2.start()
##more code
p1.terminate()
p2.terminate()
return something
基本上,我想在我的功能中启动和结束流程,但它不能正常工作。正确的方法是什么?
在使用spawn方法创建新进程的平台上,有必要将在全局范围中存在的进程创建代码放置在if __name__ == '__main__':
块中,以防止新创建的子进程尝试递归地重新执行进程创建代码,因为全局级别的所有代码都会重新执行初始化进程的内存(例如函数定义和全局变量(。将这样的测试放在一个函数或方法中,根据定义,该函数或方法不在全局范围内,通常意义不大。
在您的情况下,必须在正在执行的主脚本中有一些代码(其中__name__
将是'__main__'
,除非该脚本作为带有-mPython标志的模块启动(,直接或间接调用my_funct
函数。应该将该代码放在if __name__ == '__main__':
块中。例如:
def my_funct
##does something
p1 = Process(target = funct1)
p2 = Process(target = funct2)
p1.start()
p2.start()
##more code
p1.terminate()
p2.terminate()
return something
def function main():
# Do some work
...
# Call my_funct, which creates new child processes:
print(my_funct())
# Do some more work
...
if __name__ == '__main__':
# The following function invocation is at global scope in the main script
# and invokes code that will ultimately be creating new child processes:
main()
如果if __name__ == '__main__':
测试被移到原来的位置,那么函数main
将被调用,作为在函数my_funct
中创建的新进程的内存初始化的一部分。但我相信你不会希望main
或my_funct
的任何部分被重新执行,这将在这次行动中发生。
注意
我应该补充一点,全局范围内的任何代码,如果您不希望或不需要作为新子进程的内存初始化的一部分重新执行,都应该放在if __name__ == '__main__':
块中,而不仅仅是进程创建代码。还要注意,如果您的my_funct
是从某个模块导入的,那么__name__
一开始就不是'__main__'
。