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.'
建立子程序時,隻需要傳入一個執行函數和函數的參數,建立一個執行個體,用start()方法啟動,這樣建立程序比fork()還要簡單。
join()方法可以等待子程序結束後再繼續往下運作,通常用于程序間的同步。
程序池
Pool
如果要啟動大量的子程序,可以用程序池的方式批量建立子程序:
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print 'Run task %s (%s)...' % (name, os.getpid())request_uri/provider/reportlocation
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print 'Task %s runs %0.2f seconds.' % (name, (end - start))
p = Pool()
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print 'Waiting for all subprocesses done...'
p.close()
print 'All subprocesses done.'
代碼解讀:
對Pool對象調用join()方法會等待所有子程序執行完畢,調用join()之前必須先調用close(),調用close()之後就不能繼續添加新的Process了。
請注意輸出的結果,task 0,1,2,3是立刻執行的,而task 4要等待前面某個task完成後才執行,這是因為Pool的預設大小在我的電腦上是4,是以,最多同時執行4個程序。這是Pool有意設計的限制,并不是作業系統的限制。如果改成: