今天學習了python併發程式設計之多程序
一、multiprocessing模組介紹
python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源(os.cpu_count()檢視),在python中大部分情況需要使用多程序。python提供了multiprocessing。
multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務(比如函式),該模組與多執行緒模組threading的程式設計介面類似。
multiprocessing模組的功能眾多:支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。
需要再次強調的一點事:與執行緒不同,程序沒有任何共享狀態,程序修改的資料,改動僅限於該程序內。
二、process類的介紹
建立程序的類:
process([group[,target[,name[,args[,kwargs] ] ] ] ] ),由該類例項化得到的物件,表示乙個子程序中的任務(尚未啟動)
強調:1、需要使用關鍵字的方式來指定引數
2、args指定的為傳給target函式的位置引數,是乙個元祖形式,必須有逗號
引數介紹:
1、group引數未使用,值始終未none
2、target表示呼叫物件,即子程序要執行的任務
3、args表示呼叫物件的位置引數元祖,args=(1,2,'egon',)
4、kwargs表示呼叫物件的字典,kwargs =
5、name為子程序的名稱
方法介紹:
1、p.start(): 啟動程序,並呼叫該子程序中的p.run()
2、p.run(): 程序啟動時執行的方法,正是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法
3、p.terminate(): 強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,使用該方法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖。
4、p.is_alive(): 如果 p仍然執行,返回true
5、p.join([timeout]): 主線程等待p終止(強調:是主線程處於等的狀態,而p是處於執行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的程序,而不能hoin住run開啟的程序。
屬性介紹
1、p.daemon: 預設值為false,如果設為true,代表p為後台執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為true後,p不能建立自己的新程序,必須在p.start()之前設定
2、p.name: 程序的名稱
3、p.pid: 程序的pid
4、p.exitcode: 程序在執行時為none、如果為-n,表示被訊號n結束
三、process類的使用
if __name__ == '__main__'
由於windows沒有fork,多處理模組啟動乙個新的python程序並匯入呼叫模組。
如果匯入時呼叫process(),那麼這將啟動無限繼承的新程序(或直到機器耗盡資源)。
建立並開啟子程序的兩種方式
#開程序的方法一:
import
time
import
random
from multiprocessing import
process
defpiao(name):
print('
%s piaoing
' %name)
time.sleep(random.randrange(1,5))
print('
%s piao end
' %name)
if__name__ == '
__main__
'p1 = process(target = piao,args = ('
egon
',)) #
必須加,號
p2 = process(target = piao,args = ('
alex
',))
p3 = process(target = piao,args = ('
wupeiqi
',))
p4 = process(target = piao,args = ('
yuanhao
',))
p1.start()
p2.start()
p3.start()
p4.start()
print('
主線程'
)
#開程序的方法二:
import
time
import
random
from multiprocessing import
process
class
piao(process):
def__init__
(self,name):
super().
__init__
() self.name =name
defrun(self):
print('
%s piaoing
' %self.name)
time.sleep(ramdon.randrange(1,5))
print('
%s piao end
' %self.name)
if__name__ == '
__init__
'p1 = piao('
egon')
p2 = piao('
alex')
p3 = piao('
wupeiqi')
p4 = piao('
yuanhao')
p1.start()
p2.start()
p3.start()
p4.start()
print('
主線程')
程序之間的記憶體空間是隔離的
from multiprocessing importprocess
n = 100
defwork():
global
n n =0
print('
子程序內:
',n)
if__name__ == '
__init__
'p = process(target =work)
p.start()
print('
主程序內:
',n)
併發程式設計之多程序
程序理論 一 什麼是程序?程序 正在進行的乙個過程或者說乙個任務。而負責執行任務則是cpu。二 程序與程式的區別 程式僅僅只是一堆 而已,而程序指的是程式的執行過程。同乙個程式執行兩次,那也是兩個程序 三 併發與並行 並行處理 parallel processing 是計算機系統中能同時執行兩個或者...
python併發程式設計之多程序一
一,什麼是程序 程序是作業系統結構的基礎 是乙個正在執行的程式 計算機中正在執行的程式例項 可以分配給處理器並由處理器執行的乙個實體 二,程序與程式的區別 程序即執行中的程式,從中即可知,程序是在執行的,程式是非執行的,當然本質區別就是動態和靜態的區別。三,併發與並行解釋一 並行是指兩個或者多個事件...
Python併發程式設計之多程序(理論)
程序 正在記憶體中執行的一道程式。程式指的是一堆 而程序指的是程式執行的過程。通乙個程式執行兩次,就是兩道程序。併發 偽並行,看起來是同時執行,其實是cpu不斷切換的結果。用單個cpu加多道技術就能實現。並行 同時執行,cpu的乙個核執行一道程式,多核cpu或多個cpu才能實現。同步 在發出乙個功能...