如何在python中的另一个函数中启动进程



假设我有两个函数

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中创建的新进程的内存初始化的一部分。但我相信你不会希望mainmy_funct的任何部分被重新执行,这将在这次行动中发生。

注意

我应该补充一点,全局范围内的任何代码,如果您不希望或不需要作为新子进程的内存初始化的一部分重新执行,都应该放在if __name__ == '__main__':块中,而不仅仅是进程创建代码。还要注意,如果您的my_funct是从某个模块导入的,那么__name__一开始就不是'__main__'

相关内容

  • 没有找到相关文章

最新更新