python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源(os.cpu_count()檢視),在python中大部分情況需要使用多程序。python提供了multiprocessing
multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務(比如函式),該模組與多執行緒模組threading的程式設計介面類似。
multiprocessing模組的功能眾多:支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。
需要再次強調的一點是:與執行緒不同,程序沒有任何共享狀態,程序修改的資料,改動僅限於該程序內。
建立程序的類 :process([group [, target [, name [, args [, kwargs]]]]]),由該類例項化得到的物件,表示乙個子程序中的任務(尚未啟動)
強調:1.需要使用關鍵字的方式來指定引數
2. args指定的為傳給target函式的位置引數,是乙個元組形式,必須有逗號
引數介紹:
target表示呼叫物件,即子程序要執行的任務
args表示呼叫物件的位置引數元組,args=(1,2,'egon',)
name為子程序的名稱
方法介紹:
p.start():啟動程序,並呼叫該子程序中的p.run()
p.run():程序啟動時執行的方法,正是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法
p.terminate():
強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,
使用該方法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖
p.is_alive():如果p仍然執行,返回true
p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於執行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的程序,而不能join住run開啟的程序
屬性介紹:
p.daemon: 預設值為false,如果設為true,代表p為後台執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為true後,p不能建立自己的新程序,必須在p.start()之前設定
p.name: 程序的名稱p.pid: 程序的pid
p.exitcode:程序在執行時為none、如果為–n,表示被訊號n結束(了解即可)
p.authkey:程序的身份驗證鍵,預設是由os.urandom()隨機生成的32字元的字串。
這個鍵的用途是為涉及網路連線的底層程序間通訊提供安全性,這類連線只有在具有相同的身份驗證鍵時才能成功(了解即可)
注意:在windows中process()必須放到# if __name__ == '__main__':下if__name__ == "__main__
"由於windows沒有fork,多處理模組啟動乙個新的python程序並匯入呼叫模組。
如果在匯入時呼叫process(),那麼這將啟動無限繼承的新程序(或直到機器耗盡資源)。
這是隱藏對process()內部呼叫的原,使用if
__name__ == 「__main __」,這個if語句中的語句將不會在匯入時被呼叫。
# 開程序的方法一:importtime
import
random
from multiprocessing import
process
defpiao(name):
print('
%s piaoing
' %name)
time.sleep(random.randrange(1,5))
print('
%s piao end
' %name)
p1=process(target=piao,args=('
egon
',)) #
必須加,號
p2=process(target=piao,args=('
alex
',))
p3=process(target=piao,args=('
wupeqi
',))
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(random.randrange(1,5))
print('
%s piao end
' %self.name)
p1=piao('
egon')
p2=piao('
alex')
p3=piao('
wupeiqi')
p4=piao('
yuanhao')
p1.start()
#start會自動呼叫run
p2.start()
p3.start()
p4.start()
print('
主線程'
)
from multiprocessing import processn=100 #在windows系統中應該把全域性變數定義在if __name__ == '__main__'之上就可以了
def work():
global n
n=0print('子程序內: ',n)
if __name__ == '__main__':
p=process(target=work)
p.start()
print('主程序內: ',n)
p1.terminate() #關閉程序,不會立即關閉,所以is_alive立刻檢視的結果可能還是存活
print(p.pid) #檢視pid 只能檢視當前的程序pid
啟動程序與join程序可以簡寫為p_l=[p1,p2,p3,p4]
for p in p_l:
p.start()
for p in p_l:p.join()
from multiprocessing import processimport time
import random
class piao(process):
def __init__(self,name):
self.name=name
super().__init__()
def run(self):
print('%s is piaoing' %self.name)
time.sleep(random.randrange(1,3))
print('%s is piao end' %self.name)
p=piao('egon')
p.daemon=true #一定要在p.start()前設定,設定p為守護程序,禁止p建立子程序,並且父程序**執行結束,p即終止執行
p.start()
print('主')
python併發程式設計 多程序
import os import time from multiprocessing import process def func args,args2 print args,args2 time.sleep 3 print 子程序 os.getpid print 子程序的父程序 os.getpp...
併發程式設計 多程序1
實現原理 統一時間,載入多個任務到記憶體中,多個程序之間記憶體區域需要相互隔離,這種隔離是物理層面的隔離,其目的是為了保證數安全 指的是,作業系統會在多個程序之間做切換執行 切換任務的兩種情況 1.當乙個程序遇到了io操作 時會自動切換 2.當乙個任務執行時間超過閾值會強制切換 注意 在切換前必須儲...
併發程式設計多程序之佇列
程序彼此之間互相隔離,要實現程序間通訊 ipc multiprocessing模組支援兩種形式 佇列和管道,這兩種方式都是使用訊息傳遞的。建立佇列的類 底層就是以管道和鎖定的方式實現 queue maxsize 建立共享的程序佇列。queue是多程序安全的佇列,可以使用queue實現多程序之間的資料...