日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

7.2.2 - 并发多线程 开启进程的两种方式

發(fā)布時(shí)間:2025/4/14 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7.2.2 - 并发多线程 开启进程的两种方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。