multiprocess 模塊
-
process
from multiprocessing import Process, Pool import time import random import os def run_task(name): print "Child process %s(%s) is running." % (name, os.getpid()) if __name__ == "__main__": print "Current process %s." % os.getpid() for i in range(5): p = Process(target=run_task, args=(str(i), )) p.start() p.join() print "Waiting for subprocess done"
process.join用來阻塞進程,等上一個p進程執行完,才往下繼續執行
如果沒有指定target,默認執行process.run方法 -
pool
創建容量為3的線程池,并依次向其中加入5個任務,從結果看,雖然添加了5個任務,但是一開始只運行了其中的3個,而且每次最多運行3個,當一個任務結束了,新的任務添加進來,任務 執行使用的進程依然是原來的進程,這一點從進程的pid可以看出來from multiprocessing import Process, Pool import time import random import os def run_task(name): print "Child process %s(%s) is running." % (name, os.getpid()) time.sleep(random.random() * 4) print "Child process %s(%s) end." % (name, os.getpid()) if __name__ == '__main__': print "Current process %s." % os.getpid() p = Pool(processes=3) for i in range(5): p.apply_async(run_task, args=(str(i), )) print "Waiting for all subprocess done..." p.close() #調用join之前,必須調用close,調用close之后,不能再向進程池中添加進程 p.join() print "All subprocess done..."
pool.png
-
進程間通信
創建了大量的進程,就必須進程間的通信,python提供多種進程間通信的方式,例如Queue,Pipe,Value+Array等
Queue和Pipe的區別在于,Pipe主要用來兩個進程間通信,Queue用來多個進程間通信- Queue是多進程安全的隊列,可以使用Queue實現多進程之間的數據傳遞
Put方法用來向隊列中插入數據,可選參數為blocked,timeout,如果blocked為True(默認值),并且timeout為正值,該方法會阻塞timeout指定的時間,直到該隊列有剩余的空間,如果超時,會拋出Queue.Full異常,如果blocked為False,改Queue已滿,則立即拋出Queue,Full異常
Get方法可以從隊列中讀取并刪除一個元素,可選參數為blocked,timeout,如果blocked為True(默認值),并且timeout為正值,那么在等待的timeout時間內沒有取到任何元素,會拋出Queue.Empty異常,如果blocked為False,Queue中有一個值,則立即返回該值,否則立即拋出Queue.Empty異常
- Queue是多進程安全的隊列,可以使用Queue實現多進程之間的數據傳遞