一:multiprocessing模組介紹
python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源(os.cpu_count()檢視),在python中大部分情況需要使用多程序。python提供了multiprocessing。
multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務(比如函式),該模組與多執行緒模組threading的程式設計介面類似。
multiprocessing模組的功能眾多:支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。
需要再次強調的一點是:與執行緒不同,程序沒有任何共享狀態,程序修改的資料,改動僅限於該程序內。
二:建立子程序的兩種方式
方式一:呼叫開啟子程序的類process例項化
frommultiprocessingimportprocess方式二:自定義開啟子程序的類(繼承process)importtime
deftask(name):
print("%s is runnig"%name)
time.sleep(3)
print("process is done")
if__name__ =="__main__":#
在windows
系統中,如果不在這條語句下面呼叫的話,
# p= process(target=task,args=("egon",))#
元組方式傳值
p= process(target=task,kwargs=)#
關鍵字方式傳值,
#例項化乙個程序(未啟動)
p.start()#
應用程式給作業系統傳送請求,建立新的程序,當請求傳送後,語句就執行完畢,往下一步去了
print("*****==")
frommultiprocessingimportprocess三:父程序等待子程序importtime
classmyprocess(process):
def__init__(self,name):
super(myprocess,self).__init__()
self.name=name
defrun(self):
print('%s is running'%self.name)
time.sleep(3)
print('%s is done'%self.name)
if__name__ =='__main__':
p=myprocess('egon')
p.start()
print('主')
frommultiprocessingimportprocess上述程式的執行效果,當乙個子程序被作業系統開始建立,然後執行出街結果,在這之前,父程式一直停留在deftask(name):
print("%s is runnig"%name)
if__name__ =="__main__":
# p= process(target=task,args=("egon",))
foriinrange(10):
p= process(target=task,args=(i,))
p.start()#
向作業系統傳送請求
p.join()#
讓父程序等待子程序死亡
print("*****==")
p.join(),只有子程式執行完了後才會進行下一次的迴圈,相當於依次執行子程式,序列的效果,
將程式改動下
frommultiprocessingimportprocess這樣改動過後,所有的子程式建立請求都已經傳送給作業系統,這時候要求在所有的子程式執行結束後才執行父程式的最後一行**,總共的時間,相當於最花費時間最長的子程式,是程式有了併發執行的效果。deftask(name):
print("%s is runnig"%name)
if__name__ =="__main__":
# p= process(target=task,args=("egon",))
p_list =
foriinrange(10):
p= process(target=task,args=(i,))
p.start()#
向作業系統傳送請求
forpinp_list:
p.join()#
讓父程序等待子程序死亡
print("*****==")
四:程序的其他屬性
frommultiprocessingimportprocess五:驗證程序之間的物理隔離importtime
deftask(name):
print("%s is runnig"%name)
time.sleep(1)
print("process is done")
if__name__ =="__main__":
p= process(target=task,kwargs=)
p.start()
print(p.pid)#程序p
的idprint(p.name)#程序p
的名字print(p.terminate())#
強制終止程序
p.join()
print(p.is_alive())#
程序是否存在
frommultiprocessingimportprocess六:殭屍程序與孤兒程序importtime
x = 1000
deftask(name):
globalx
x =0
#修改的是子程序自己的屬性
x,因為記憶體的物理隔離,所以子程序的修改不會影響到父程序
print("%s is runnig"%name)
time.sleep(1)
print("process is done",x)#
列印的是子程序的資料
if__name__ =="__main__":
# p= process(target=task,args=("egon",))
p= process(target=task,kwargs=)
p.start()
p.join()#
讓父程序等待子程序死亡
print("*****==")
print(x)#
列印的是父程序的屬性
殭屍程序:在linux中父程序建立子程序,在子程序執行結束完成後,並不會完全的「死去」,而是會保留一些狀態屬性供父程序查詢,當父程序查詢到子程序死去後,會啟用自己的**機制,**子程式的「屍體」,另外,linux中__init__是所有程序的父程序。
殭屍程序的危害:每乙個程序都有乙個程序id如果殭屍程序沒有被**的話,會占用程序id,
孤兒程序:當父程序退出,而子程序仍在執行的時候,這些,子進成沒有了父程序監測,就變成了孤兒程序,但是孤兒程序是無害的,因為在孤兒程序出現後,系統主程序init將會接管孤兒程序,成為孤兒程序新的父程序。替代完成父程序的一系列工作。
python併發程式設計之多程序
今天學習了python併發程式設計之多程序 一 multiprocessing模組介紹 python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multi...
python之多程序
要讓python實現多程序 multiprocessing 我們先來了解作業系統相關知識。unix 和 linux 作業系統提供了乙個 fork 函式系統呼叫,它非常特殊。普通的函式,呼叫一它次,執行一次,但是 fork 函式呼叫一次執行兩次,因為作業系統自動把當前程序 稱為父程序 複製了乙份 稱為...
python併發程式設計之多程序一
一,什麼是程序 程序是作業系統結構的基礎 是乙個正在執行的程式 計算機中正在執行的程式例項 可以分配給處理器並由處理器執行的乙個實體 二,程序與程式的區別 程序即執行中的程式,從中即可知,程序是在執行的,程式是非執行的,當然本質區別就是動態和靜態的區別。三,併發與並行解釋一 並行是指兩個或者多個事件...