要讓python實現多程序「multiprocessing」。我們先來了解作業系統相關知識。
unix 和 linux 作業系統提供了乙個 fork() 函式系統呼叫,它非常特殊。普通的函式,呼叫一它次,執行一次,但是 fork() 函式呼叫一次執行兩次,因為作業系統自動把當前程序「稱為父程序」複製了乙份「稱為子程序」,然後,分別在子程序和父程序中執行。
子程序永遠返回0,而父程序返回子程序的 id。這樣做的理由是,乙個父程序可以 fork() 多個子程序,所以父程序要記下所有子程序的 id,而子程序只要呼叫 getppid() 就可以拿到父程序的 id。
python中 os 模組封裝了常見的系統呼叫,其中就包括 fork(),可以在python程式中輕鬆建立子程式:
import os
print('process (%s) start ...' % os.getpid())
#only work on unix/linux/mac
#不能在windows平台上執行
pid = os.fork()
if pid == 0:
print('i am child process (%) and my parent is %s.' % (os.getpid(),os.getppid()))
else:
print('i (%) just created a child process (%).' % (os.getpid(),pid))
執行結果:
process (876) start...
i (876) just created a child process (877).
i am child process (877) and my parent is 876.
由於 windows 平台下沒有 fork() 函式呼叫,所以**沒有辦法在 windows平台下執行。
有了 fork 呼叫,乙個程序在接到任務的時候就可以複雜出來乙個子程序來處理新任務,常見的 apache 伺服器就是由父程序監聽埠,每當有新的 http 請求時,就 fork 出新的子程序來處理新的 http 請求。
如果你想寫多程序的服務程式,unix/linux 平台最好了,當然也可以在 windows 平台下來編寫,因為 python 跨平台。multiprocessing 模組就是跨平台版本的多程序模組。
multiprocessing 模組提供了乙個 process 類來代表乙個程序物件,下面乙個例子用來演示啟動乙個子程序並等待結束的例子:
import os
from multiprocessing import process
#子程序要執行的**
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('child process will start')
p.start()#子程式開始執行
p.join()
print('child process end.')
import os,time,random
from multiprocessing import pool
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 run %0.2f seconds.' % (name,(end-start)))
if __name__ == '__main__':
print('parent process %s.' % os.getpid())
p = pool(4)
for i in range(5):
print('waiting for all subprocess done...')
p.close()
p.join()
print('all subprocess done')
執行結果:
parent process 7600.
waiting for all subprocess done...
run task 0 (11392)...
run task 1 (6432)...
run task 2 (10768)...
run task 3 (5116)...
task 0 run 0.03 seconds.
run task 4 (11392)...
task 3 run 1.42 seconds.
task 1 run 1.77 seconds.
task 4 run 2.59 seconds.
task 2 run 2.93 seconds.
all subprocess done
process finished with exit code 0
p = pool(5)
就可以同時跑 5 個程序。
很多時候,子程序並不是本身,熱是乙個外部的程序。我們建立了子程序之後,還要控制程序的輸入和輸出。
subprocess 模組可以讓我們非常方便的啟動乙個子程序,然後控制輸入和輸出。
這一部分未完待續
process 間肯定是要通訊的,作業系統提供了很多機制來實現程序間的通訊,python 中的 multiprocessing 模組包裝了底層的機制,提供了 queue、pipes 等多種方法來交換資料。
我們以 queue 為例,在父程序中建立兩個子程序,乙個往 queue 裡寫資料,乙個從 queue 中讀資料。
from multiprocessing import queue,process
import os,time,random
#寫資料程序執行的**
def write(q):
print('process to write : %s' % os.getpid())
for value in ['a','b','c']:
print('put %s queue...' % value)
q.put(value)
time.sleep(random.random())
#讀資料執行的**
def read(q):
print('process to read : %s' % os.getpid())
while true:
value = q.get(true)
print('get %s from queue.' % value)
if __name__ == '__main__':
#父程序建立queue,並傳給各個子程序
q = queue()
pw = process(target=write,args=(q,))
pr = process(target=read,args=(q,))
#啟動子程式pw,寫入:
pw.start()
#啟動子程式pr,讀取:
pr.start()
#等待pw結束:
pw.join()
#pr程序是死迴圈,無法等待它結束,只能強行終止。
pr.terminate()
執行結果
process to read : 8416
process to write : 12840
put a queue...
get a from queue.
put b queue...
get b from queue.
put c queue...
get c from queue.
process finished with exit code 0
python併發之多程序
一 multiprocessing模組介紹 python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在...
python學習之多程序
在介紹多程序之前,首先介紹下作業系統獲取關於程序中的一些資訊 方法描述 os.getpid 獲取當前程序的pid os.getppid 獲取當前程序的父程序的pid 在python中,我們一般都是通過引入multiprocessing模組來實現多程序程式設計,multiprocessing模組提供了...
Python學習之多程序例項
第一部分 任務分發端 usr bin env python coding utf 8 time 17 9 17 上午10 49 author mylovin file multiprocess server.py software pycharm 說明 多程序例項 分發任務端 匯入必備標頭檔案 im...