首页 > 代码库 > python 多进程的启动和代码执行顺序

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

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

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