在 python高階教程m10–多執行緒 和 python高階教程m10b–多執行緒通訊 我們介紹了多執行緒程式設計,並行程式設計模式中還有一種多程序程式設計模式,這篇文章將介紹到多程序程式設計。
多程序需要用到multiprocessing模組,多程序程式設計模型可以參考多執行緒模型。 通過乙個例子我們先來看下多程序的基本程式設計模型,在這個例子中主程序定義和開啟了乙個子程序,在子程序中列印自己的程序名稱和迴圈次數,迴圈次數達到上限後退出子程序:
import os,time, multiprocessing
def func1():
proc_name = multiprocessing.current_process().name
proc_id = os.getpid()
print('進入程序: pid = ', proc_id,' name=',proc_name)
print('父程序id: ', os.getppid())
loopcnt = 0
while loopcnt < 10:
loopcnt = loopcnt + 1
print('程序: %s, loopcnt=%d' % (proc_id, loopcnt))
time.sleep(0.3)
print('退出程序: ' , proc_id)
if __name__ == '__main__':
print('\n-----歡迎來到www.juzicode.com')
proc_name = multiprocessing.current_process().name
proc_id = os.getpid()
print('進入主程序: pid = ', proc_id,' name=',proc_name)
p1 = multiprocessing.process(target=func1, name='func1')
p1.start()
#p1.join()
time.sleep(5)
print('退出主程序: ' ,proc_id)
*****===執行結果:
-----歡迎來到www.juzicode.com
進入主程序: pid = 13692 name= mainprocess
進入程序: pid = 26540 name= func1
父程序id: 13692
程序: 26540, loopcnt=1
程序: 26540, loopcnt=2
程序: 26540, loopcnt=3
程序: 26540, loopcnt=4
程序: 26540, loopcnt=5
程序: 26540, loopcnt=6
程序: 26540, loopcnt=7
程序: 26540, loopcnt=8
程序: 26540, loopcnt=9
程序: 26540, loopcnt=10
退出程序: 26540
退出主程序: 13692
從上面的例子可以看出多程序程式設計的基本模型和多執行緒是一樣的:首先定義乙個或多個任務函式,這個例子中定義了乙個func1任務(函式);在主線程中用multiprocessing.process()定義了這個任務的例項p1;然後使用 p1.start()啟動func1任務。 注意在 process (target=func1, name=』func1′)定義任務例項時,target入參是函式名稱func1,而不是執行函式「func1()」的寫法,是不帶「()」符號的。
通過multiprocessing 的屬性和方法可以獲取執行緒列表、活動執行緒數、執行緒id等:
multiprocessing .active_children()
獲取活動子程序物件
返回包含子程序物件的list
multiprocessing .current_process()
返回當前程序物件
該物件下的name屬性可以獲取到當前程序的名稱
多程序沒有類似多執行緒get_ident()獲取執行緒id的方法,但是可以使用os.getpid()獲取該程序的編號,使用os.getppid()獲取父程序的編號。
通過multiprocessing.process()建立的執行緒物件常用的屬性、方法有:
is_alive()
判斷程序程物件是否是活動的
在使用start()啟動執行緒前和執行緒結束後,呼叫該方法返回false
name
程序物件名稱
僅僅用來標識,可以不是唯一的
start()
開啟程序
程序建立後只是建立了物件,需要使用start()方法開啟程序。
join()
等待程序結束
呼叫者會被阻塞,直到被啟動程序結束,如果被啟動程序中使用無限迴圈時需要小心
multiprocessing、程序物件的屬性方法的乙個例子:
import os,time, multiprocessing
def func1():
proc_name = multiprocessing.current_process().name
proc_id = os.getpid()
print('進入程序: pid = ', proc_id,' name=',proc_name)
print('父程序id: ', os.getppid())
loopcnt = 0
while loopcnt < 5:
loopcnt = loopcnt + 1
print('程序: %s, loopcnt=%d' % (proc_id, loopcnt))
time.sleep(0.2)
print('退出程序: ' , proc_id)
if __name__ == '__main__':
print('\n-----歡迎來到www.juzicode.com')
proc_name = multiprocessing.current_process().name
proc_id = os.getpid()
print('進入主程序: pid = ', proc_id,' name=',proc_name)
print('主程序的父程序id: ', os.getppid())
p1 = multiprocessing.process(target=func1, name='func1')
p2 = multiprocessing.process(target=func1, name='func2')
p1.start()
p2.start()
print('子程序1的名稱:',p1.name)
print('子程序2的名稱:',p2.name)
print('當前活動子程序數:', multiprocessing.active_children())
print('子程序1是否存活:',p1.is_alive())
print('子程序2是否存活:',p2.is_alive())
time.sleep(5)
print('主程序延時5s後:')
print('子程序1是否存活:',p1.is_alive())
print('子程序2是否存活:',p2.is_alive())
print('退出主程序: ' ,proc_id)
**********執行結果:
-----歡迎來到www.juzicode.com
進入主程序: pid = 3868 name= mainprocess
主程序的父程序id: 10264
子程序1的名稱: func1
子程序2的名稱: func2
當前活動子程序數: [, ]
子程序1是否存活: true
子程序2是否存活: true
進入程序: pid = 21616 name= func2
父程序id: 3868
程序: 21616, loopcnt=1
進入程序: pid = 9796 name= func1
父程序id: 3868
程序: 9796, loopcnt=1
程序: 21616, loopcnt=2
程序: 9796, loopcnt=2
程序: 21616, loopcnt=3
程序: 9796, loopcnt=3
程序: 21616, loopcnt=4
程序: 9796, loopcnt=4
程序: 21616, loopcnt=5
程序: 9796, loopcnt=5
退出程序: 21616
退出程序: 9796
主程序延時5s後:
子程序1是否存活: false
子程序2是否存活: false
退出主程序: 3868
args、kwargs、daemon等入參的功能和用法參照 python高階教程m10–多執行緒 。
多程序通訊也可以使用 manager、pipe、event、lock 等並行程式設計工具包,使用方法參照 python高階教程m10b–多執行緒通訊 。
推薦閱讀:python高階教程m10–多執行緒
python高階教程m10b–多執行緒通訊
python 多程序 高階 程序池
如果需要啟動大量的子程序,使用程序池批量建立子程序的方式更加常見,因為當被操作對物件數目不大時,可以直接利用multiprocessing中的process動態生成多個程序,如果數量大,此時就應該使用pool。pool 可以提供指定數量的程序供使用者呼叫,預設大小是cpu的核數。當有新的請求提交到p...
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...