7.2.2 - 并发多线程 开启进程的两种方式
一 multiprocessing模塊介紹
python中的多線程無法利用多核優(yōu)勢,如果想要充分地使用多核CPU的資源(os.cpu\_count\(\)查看),在python中大部分情況需要使用多進(jìn)程。
Python提供了multiprocessing。 multiprocessing模塊用來開啟子進(jìn)程,并在子進(jìn)程中執(zhí)行我們定制的任務(wù)(比如函數(shù)),該模塊與多線程模塊threading的編程接口類似。multiprocessing模塊的功能眾多:支持子進(jìn)程、通信和共享數(shù)據(jù)、執(zhí)行不同形式的同步,>提供了Process、Queue、Pipe、Lock等組件。
需要再次強(qiáng)調(diào)的一點(diǎn)是:與線程不同,進(jìn)程沒有任何共享狀態(tài),進(jìn)程修改的數(shù)據(jù),改動(dòng)僅限于該進(jìn)程內(nèi)。
二 Process類的介紹
創(chuàng)建進(jìn)程的類:
Process([group [, target [, name [, args [, kwargs]]]]]),由該類實(shí)例化得到的對象,可用來開啟一個(gè)子進(jìn)程 強(qiáng)調(diào): 1. 需要使用關(guān)鍵字的方式來指定參數(shù) 2. args指定的為傳給target函數(shù)的位置參數(shù),是一個(gè)元組形式,必須有逗號(hào)參數(shù)介紹:
group參數(shù)未使用,值始終為None target表示調(diào)用對象,即子進(jìn)程要執(zhí)行的任務(wù) args表示調(diào)用對象的位置參數(shù)元組,args=(1,2,'cmz',) kwargs表示調(diào)用對象的字典,kwargs={'name':'cmz','age':18} name為子進(jìn)程的名稱?
方法介紹:
p.start():啟動(dòng)進(jìn)程,并調(diào)用該子進(jìn)程中的p.run() p.run():進(jìn)程啟動(dòng)時(shí)運(yùn)行的方法,正是它去調(diào)用target指定的函數(shù),我們自定義類的類中一定要實(shí)現(xiàn)該方法 p.terminate():強(qiáng)制終止進(jìn)程p,不會(huì)進(jìn)行任何清理操作,如果p創(chuàng)建了子進(jìn)程,該子進(jìn)程就成了僵尸進(jìn)程,使用該方法需要特別小心這種情況。如果p還保存了一個(gè)鎖那么也將不會(huì)被釋放,進(jìn)而導(dǎo)致死鎖 p.is_alive():如果p仍然運(yùn)行,返回Truep.join([timeout]):主線程等待p終止(強(qiáng)調(diào):是主線程處于等的狀態(tài),而p是處于運(yùn)行的狀態(tài))。timeout是可選的超時(shí)時(shí)間。?
屬性介紹:
p.daemon:默認(rèn)值為False,如果設(shè)為True,代表p為后臺(tái)運(yùn)行的守護(hù)進(jìn)程,當(dāng)p的父進(jìn)程終止時(shí),p也隨之終止,并且設(shè)定為True后,p不能創(chuàng)建自己的新進(jìn)程,必須在p.start()之前設(shè)置 p.name:進(jìn)程的名稱 p.pid:進(jìn)程的pid?
三 Process類的使用
注意:在windows中Process()必須放到# if __name__ == '__main__':下
創(chuàng)建并開啟子進(jìn)程的方式一
import time import random from multiprocessing import Processdef running(name):print('%s runninging' %name)time.sleep(random.randrange(1,5))print('%s running end' %name)if __name__ == '__main__':#實(shí)例化得到四個(gè)對象p1=Process(target=running,args=('cmz1',)) #必須加,號(hào)p2=Process(target=running,args=('cmz2',))p3=Process(target=running,args=('cmz3',))p4=Process(target=running,args=('cmz4',))#調(diào)用對象下的方法,開啟四個(gè)進(jìn)程 p1.start()p2.start()p3.start()p4.start()print('主')創(chuàng)建并開啟子進(jìn)程的方式二
import time import random from multiprocessing import Processclass running(Process):def __init__(self,name):super().__init__()self.name=namedef run(self):print('%s running' %self.name)time.sleep(random.randrange(1,5))print('%s running end' %self.name)if __name__ == '__main__':#實(shí)例化得到四個(gè)對象p1=running('cmz1')p2=running('cmz2')p3=running('cmz3')p4=running('cmz4')#調(diào)用對象下的方法,開啟四個(gè)進(jìn)程p1.start() #start會(huì)自動(dòng)調(diào)用run p2.start()p3.start()p4.start()print('主')練習(xí)
from multiprocessing import Processn=100 #在windows系統(tǒng)中應(yīng)該把全局變量定義在if __name__ == '__main__'之上就可以了def work():global nn=0print('子進(jìn)程內(nèi): ',n)if __name__ == '__main__':p=Process(target=work)p.start()print('主進(jìn)程內(nèi): ',n)結(jié)果是(子進(jìn)程在開始的時(shí)候拷貝了父進(jìn)程的數(shù)據(jù),然后自己又修改了數(shù)據(jù)。)
主進(jìn)程內(nèi): 100 子進(jìn)程內(nèi): 0?
轉(zhuǎn)載于:https://www.cnblogs.com/caimengzhi/p/8511406.html
總結(jié)
以上是生活随笔為你收集整理的7.2.2 - 并发多线程 开启进程的两种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术管理:带人和团队管理
- 下一篇: vs2013在使用ef6时,创建模型向导