试图理解python中使用main的多处理



使用下面的代码,我得到了奇怪的输出:

import  sys 
from  multiprocessing import Process
import time
from time import strftime
now =time.time()    
print time.strftime("%Y%m%d %H:%M:%S", time.localtime(now)) 
fr= [1,2,3]
for row in fr:
    print 3
print 1
def worker():
    print 'worker line'
    time.sleep(1)
    sys.exit(1)
def main():
    print 'start worker'
    Process(target=worker, args=()).start()
    print 'main line'
if __name__ == "__main__":
    start_time = time.time()
    main()
    end_time = time.time()
    duration = end_time - start_time
    print "Duration: %s" % duration

输出为:

20120324 20:35:53
3
3
3
1
start worker
main line
Duration: 0.0
20120324 20:35:53
3
3
3
1
worker line 

我想我会得到这个:

20120324 20:35:53
3
3
3
1
start worker
worker line
main line
Duration: 1.0

为什么要跑两次?在WinX64:上使用python 2.7

20120324 20:35:53
3
3
3
1
worker line 

问题主要是因为multiprocessing实际上是设计为在posix系统上运行的,该系统具有fork(2)系统调用。在这些操作系统上,进程可以一分为二,子进程神奇地从父进程克隆状态,然后两者都在同一个地方恢复运行,子进程现在有了新的进程ID。在这种情况下,multiprocessing可以根据需要安排一些机制将状态从父进程传送到子进程,可以肯定的是,子进程已经拥有了所需的大部分python状态。

Windows没有fork()

因此multiprocessing必须弥补这一不足。这基本上包括启动一个全新的python解释器,运行一个多处理子脚本。几乎立刻,父母会要求孩子使用处于父母状态的东西,因此孩子必须从头开始重新创建该状态,通过将脚本导入孩子

因此,在脚本中导入时发生的任何事情都将发生两次,一次发生在父级中,另一次在子级中,因为它重新创建了为父级提供服务所需的python环境。

这是我使用Python 2.7.3:在Linux上运行代码时得到的结果

20120324 23:05:49
3
3
3
1
start worker
main line
Duration: 0.0045280456543
worker line

我不知道为什么你的运行两次,但我可以告诉你为什么它没有返回预期的持续时间或以"正确"的顺序打印。

使用multiprocessing启动进程时,启动是异步的。也就是说,.start()函数在父进程中立即返回,这样父进程就可以继续工作并做其他事情(比如启动更多进程),而子进程则在后台做自己的事情。如果要阻止父进程继续进行,直到子进程结束,则应使用.join()函数。像这样:

def main():
    print 'start worker'
    p = Process(target=worker, args=())
    p.start()
    p.join()
    print 'main line'

相关内容

  • 没有找到相关文章

最新更新