python併發之多程序

2021-08-19 06:57:31 字數 4661 閱讀 1031

一:multiprocessing模組介紹

python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源(os.cpu_count()檢視),在python中大部分情況需要使用多程序。python提供了multiprocessing。

multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務(比如函式),該模組與多執行緒模組threading的程式設計介面類似。

multiprocessing模組的功能眾多:支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。

需要再次強調的一點是:與執行緒不同,程序沒有任何共享狀態,程序修改的資料,改動僅限於該程序內。

二:建立子程序的兩種方式

方式一:呼叫開啟子程序的類process例項化

frommultiprocessingimportprocess

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("*****==")

方式二:自定義開啟子程序的類(繼承process)

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併發程式設計之多程序一

一,什麼是程序 程序是作業系統結構的基礎 是乙個正在執行的程式 計算機中正在執行的程式例項 可以分配給處理器並由處理器執行的乙個實體 二,程序與程式的區別 程序即執行中的程式,從中即可知,程序是在執行的,程式是非執行的,當然本質區別就是動態和靜態的區別。三,併發與並行解釋一 並行是指兩個或者多個事件...