繁体   English   中英

如何在运行完整脚本的python中停止多处理

[英]How to stop multiprocessing in python running for the full script

我在python中有以下代码:

import multiprocessing
import time

print "I want this to show once at the beggining"

def leaveout():
    print "I dont Want This to Show"

def hang(input1):
        print "I want this to show 3 times"
        print "Number = %s" % input1

def main():
    p = multiprocessing.Process(target=hang, args=("0"))
    p.start()
    p1 = multiprocessing.Process(target=hang, args=("1"))
    p1.start()
    p2 = multiprocessing.Process(target=hang, args=("2"))
    p2.start()
    p.join()
    p1.join()
    p2.join()

if __name__ == '__main__':
    main()

print "I want this to show once at the end"

我的目标是在成功发生的三个实例中对hang函数进行多进程处理。 我的问题是,main函数还在以下输出中重新运行了整个脚本的三个实例:

c:\Evopt>python multiprocessingprac.py
I want this to show once at the beggining
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 2
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 1
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 0
I want this to show once at the end

我该如何阻止这种情况发生?

生成新进程时,Windows将创建一个空白进程。 然后,在生成的过程中加载了一个新的Python解释器,并为其提供了相同的代码库来进行解释。

这就是为什么您看到重复的打印语句正在执行的原因。 由于它们是顶级表达式,因此每次过程将评估该代码时都将执行它们。

在Unix OS中,这没有被观察到,因为它实现了完全不同的进程创建机制( fork策略),该机制不需要在子进程中再次加载新的Python解释器。

要解决您的问题,您需要从脚本中删除print( ... )表达式,并将其移至main函数中。

def main():
    print("I want this to show once at the beggining")

    p0 = multiprocessing.Process( ... )
    p0.start() 

    ...

    p2.join()

    print("I want this to show once at the end")

您可以在多处理文档中阅读有关流程启动策略的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM