天天看點

多程序和程序池

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有意設計的限制,并不是作業系統的限制。如果改成:

繼續閱讀