标签:ken mrr sim one sea gtd dft abd box
对照着廖雪峰的网站学习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首先运行,在调用刚创建子进程时,创建子进程已经创建好,然后继续执行后序代码,当子进程创建好后,显示子进程。
就是说子进程创建需要时间,在这个空闲时间,父线程继续执行代码,子进程创建完成后显示。
标签:ken mrr sim one sea gtd dft abd box
原文地址:http://www.cnblogs.com/zhuzhu2016/p/6047013.html