python 多进程的启动和代码执行顺序

对照着廖雪峰的网站学习Python遇到些问题:

在进程中,父进程创建子进程时发现,显示不是按照顺序显示,疑问?

参照代码如下:  

 1 from multiprocessing import Pool
 2 import os, time, random
 3 
 4 def long_time_task(name):
 5     print 'Run task %s (%s)...' % (name, os.getpid())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print 'Task %s runs %0.2f seconds.' % (name, (end - start))
10 
11 if __name__=='__main__':
12     print 'Parent process %s.' % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16     print 'Waiting for all subprocesses done...'
17     p.close()
18     p.join()
19     print 'All subprocesses done.'

运行结果:

  可以看出代码执行是从if __name__=='__main__'开始执行,在执行15行调用long_time_task后,没有打印'Run task %s (%s)...'

  但是在15行p.apply_async(long_time_task, args=(i,)),加入 print ‘??’,会在'Waiting for all subprocesses done...',之前,打印‘’??‘’对这个很疑惑。

修改代码,让每个打印时,打印出时间:

 1 from multiprocessing import Pool
 2 import os, time, random
 3 
 4 def long_time_task(name):
 5     print 'Run task %s (%s) at %f...' % (name, os.getpid(),time.time())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print 'Task %s runs %0.2f seconds.' % (name, (end - start))
10 
11 if __name__=='__main__':
12     print 'Parent process %s.' % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16         print 'time:%s:' %time.time()    
17     print 'parent: %f' %time.time()
18     print 'Waiting for all subprocesses done...'
19     p.close()
20     p.join()
21     print 'All subprocesses done.'
22     

运行结果:

这样就找到原因了:

  ps:在新代码中将原来的代码中long_time_task()创建子进程中的sleep删去。

  parent首先运行,在调用刚创建子进程时,创建子进程已经创建好,然后继续执行后序代码,当子进程创建好后,显示子进程。

  就是说子进程创建需要时间在这个空闲时间,父线程继续执行代码,子进程创建完成后显示

posted on 2016-11-09 15:00  zhuzhu2016  阅读(6595)  评论(1编辑  收藏  举报

导航