unix上有os.fork() 功能,能夠在unix上運行,但不能在wins上運行。python
python是跨平臺的,因此建立了一個multiprocessing模塊app
multiprocessing
模塊提供了一個Process
類來表明一個進程對象,下面的例子演示了啓動一個子進程並等待其結束:dom
from multiprocessing import Process import os # 子進程要執行的代碼 def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) print 'Process will start.' p.start() p.join() print 'Process end.'
multiprocessing 提供了Pool class來批量生成子進程async
from multiprocessing import Pool import os, time, random def long_time_task(name): print 'Run task %s (%s)...' % (name, os.getpid()) start = time.time() time.sleep(random.random() * 3) end = time.time() print 'Task %s runs %0.2f seconds.' % (name, (end - start)) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Pool() for i in range(5): p.apply_async(long_time_task, args=(i,)) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses done.'
p.join()沒有timeout設置,放到close()以後,close以後的P就沒法產生新的子進程操作系統
請注意輸出的結果,task 0
,1
,2
,3
是馬上執行的,而task 4
要等待前面某個task完成後才執行,這是由於Pool
的默認大小在個人電腦上是4,所以,最多同時執行4個進程。這是Pool
有意設計的限制,並非操做系統的限制。若是改爲:設計
p = Pool(5)
就能夠同時跑5個進程。unix
因爲Pool
的默認大小是CPU的核數code