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首先运行,在调用刚创建子进程时,创建子进程已经创建好,然后继续执行后序代码,当子进程创建好后,显示子进程。

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

转载于:https://www.cnblogs.com/zhuzhu2016/p/6047013.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值