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函式的位置引數,是乙個元組形式,必須有逗號
引數介紹:
group引數未使用,值始終為nonetarget表示呼叫物件,即子程序要執行的任務
args表示呼叫物件的位置引數元組,args=(1,2,'
cmz'
,)kwargs表示呼叫物件的字典,kwargs=
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.daemon:預設值為false,如果設為true,代表p為後台執行的守護程序,當p的父程序終止時,p也隨之終止,並且設定為true後,p不能建立自己的新程序,必須在p.start()之前設定p.name:程序的名稱
p.pid:程序的pid
注意:在windows中process()必須放到# if __name__ == '__main__':下
建立並開啟子程序的方式一
importtime
import
random
from multiprocessing import
process
defrunning(name):
print('
%s runninging
' %name)
time.sleep(random.randrange(1,5))
print('
%s running end
' %name)
if__name__ == '
__main__':
#例項化得到四個物件
p1=process(target=running,args=('
cmz1
',)) #
必須加,號
p2=process(target=running,args=('cmz2
',))
p3=process(target=running,args=('cmz3
',))
p4=process(target=running,args=('cmz4
',))
#呼叫物件下的方法,開啟四個程序
p1.start()
p2.start()
p3.start()
p4.start()
print('
主')
建立並開啟子程序的方式二
importtime
import
random
from multiprocessing import
process
class
running(process):
def__init__
(self,name):
super().
__init__
() self.name=name
defrun(self):
print('
%s running
' %self.name)
time.sleep(random.randrange(1,5))
print('
%s running end
' %self.name)
if__name__ == '
__main__':
#例項化得到四個物件
p1=running('cmz1')
p2=running('cmz2')
p3=running('cmz3')
p4=running('cmz4')
#呼叫物件下的方法,開啟四個程序
p1.start() #
start會自動呼叫run
p2.start()
p3.start()
p4.start()
print('
主')
練習
from multiprocessing importprocess
n=100 #
在windows系統中應該把全域性變數定義在if __name__ == '__main__'之上就可以了
defwork():
global
n n=0
print('
子程序內:
',n)
if__name__ == '
__main__':
p=process(target=work)
p.start()
print('
主程序內:
',n)
結果是(子程序在開始的時候拷貝了父程序的資料,然後自己又修改了資料。)
主程序內: 100 子程序內: 0
Python 開啟執行緒和程序的兩種方式
開銷 在發生開啟程序給作業系統時,作業系統需要申請記憶體空間給子程序,拷貝父程序位址空間到子程序,而開啟執行緒不需要這些步驟,因此開啟程序開銷遠大於執行緒,開啟速度為執行緒快 位址空間 程序之間位址空間是隔離的,開多個程序,每個程序都有不同的pid,但子程序的資料是來自於拷貝父程序的資料,程序之間存...
python3 開啟多執行緒的兩種寫法
寫法一 importtime from threading importthread deffunc name print f 開始 time.sleep 0.5 print f 結束 if name main t1 thread target func,args 執行緒1 t2 thread ta...
2 2 開啟程序的兩種方式
python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務 比如函式 該模組...