色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

瀏覽:33日期:2022-08-01 13:48:34

本文實(shí)例講述了Python多線程Threading、子線程與守護(hù)線程。分享給大家供大家參考,具體如下:

線程與進(jìn)程: 線程對于進(jìn)程來說,就好似工廠里的工人,分配資源是分配到工廠,工人再去處理。 線程是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。 在單個程序中同時運(yùn)行多個線程完成不同的工作,稱為多線程 對于IO密集型的程序來說,多線程可以利用讀IO的時間去做其他事【IO并不占用CPU,這就好像A買個一份外賣,他只需要等著送過來然后敲A家的門就行了】; 而對于CPU密集型的程序來說,多線程的效率就不是很高了【CPU由于要計(jì)算,切換之間要恢復(fù)之前的現(xiàn)場消耗相對較大,比如我同時做幾份作業(yè),一份作業(yè)做十分鐘,假如十分鐘做不完一份作業(yè),那么我后面再回頭做的時候,我就要好好想想剛才做到哪,剛才想到哪】

補(bǔ)充:IO需要CPU嗎?知乎:https://www.zhihu.com/question/27734728

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

線程Threading:

python中多線程需要使用threading模塊

線程的創(chuàng)建與運(yùn)行:

1.直接調(diào)用threading的Thread類:

線程的創(chuàng)建:線程對象=thread.Thread(target=函數(shù)名,args=(參數(shù)))【補(bǔ)充,由于args是一個元組,單個參數(shù)時要加“,”】

線程的啟動:線程對象.start(),調(diào)用start(),那么線程對象會自動去調(diào)用thread.Thread中的run()

讓主線程等待其余線程結(jié)束:線程對象.join(),加了join之后,相當(dāng)于阻塞了主線程,主線程只有當(dāng)join的線程結(jié)束后才會向下執(zhí)行

import threading,timedef run(n): time.sleep(1) print('task ',n)t1=threading.Thread(target=run,args=('t1',))t2 = threading.Thread(target=run,args=('t2',))start_time=time.time()#開始時間t1.start()t2.start()##因?yàn)槭仟?dú)立線程,如果想要主線程等待其他線程運(yùn)行完畢,需要使用joint1.join()t2.join()spend_time=time.time()-start_timeprint(spend_time)##1.0多,說明是并行的結(jié)果

附加說明--join是阻塞等待:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#調(diào)用父類的__init__() self.name=name def run(self):#重寫方法,按自己的要求去寫 time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t2=MyTread('t2')start_time=time.time()t1.start()t2.start()t1.join()t2.join()time.sleep(1)###主線程等待其余線程結(jié)束print(time.time()-start_time)#結(jié)果是2.0多,證明是join是相當(dāng)于阻塞了主線程的執(zhí)行,只有當(dāng)線程結(jié)束后才會向下執(zhí)行

2.繼承threading的Thread類:

繼承threading的Thread類的類要主要做兩件事:

1.如果不做自定義變量的初始化,那么可以直接使用繼承的父類的__init__(),如果需要做自定義變量的初始化,則需要先調(diào)用父類的__init__()【否則需要自己填寫線程初始化相關(guān)的參數(shù)】

2.重寫run,雖然繼承了父類的run,但實(shí)際上如果不重寫,那么我們繼承threading的Thread類又有什么意義呢?為什么不直接調(diào)用threading的Thread類

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__()#調(diào)用父類的__init__() self.name=name def run(self):#重寫方法,按自己的要求去寫 time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t2=MyTread('t2')start_time=time.time()t1.start()t2.start()###主線程等待其余線程結(jié)束t1.join()t2.join()print(time.time()-start_time)#結(jié)果是1.0多,證明是并行的 子線程: 由一個線程啟動的線程可以成為它的子線程,A啟動B,B是A的子線程,A是B的父線程 線程的幾個常用函數(shù): threading.current_thread():

返回當(dāng)前正在運(yùn)行的線程對象

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解threading.active_count():

返回當(dāng)前進(jìn)程中的存活的線程對象數(shù)

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

線程對象.isAlive()方法判斷線程是否存活

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

getName(): 返回線程名。 setName(): 設(shè)置線程名。

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

get_ident():獲取當(dāng)前線程ID。

守護(hù)線程: 守護(hù)線程是起到輔助功能的,就好像魔法師放禁咒總要騎士保護(hù)一樣【魔法師只需要關(guān)系自己的任務(wù),保護(hù)他的任務(wù)交給守護(hù)者】 而守護(hù)線程與主線程的關(guān)系呢,就好像備胎跟女神,去買東西的話,備胎要一直在外面等女神【守護(hù)線程運(yùn)行結(jié)束就狗帶,但不影響主進(jìn)程結(jié)束,由主線程決定運(yùn)行時間】,女神不需要等待備胎【主線程結(jié)束,守護(hù)線程也要結(jié)束,不管自身任務(wù)是否完成】 與join的區(qū)別:join是阻塞等待,守護(hù)線程是并行的等待 設(shè)置守護(hù)線程:線程對象.setDaemon(True)【注意!!!!!設(shè)置守護(hù)線程必須要在start()前面,不然會報錯】

下面的代碼顯示了主線程并不會等待其守護(hù)線程結(jié)束:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print('守護(hù)線程已經(jīng)啟動',self.name) time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t1.setDaemon(True)t2=MyTread('t2')t2.setDaemon(True)start_time=time.time()#開始時間t1.start()t2.start()spend_time=time.time()-start_timeprint(spend_time)##0.0多,而且三個線程都執(zhí)行完畢了,說明這個是并行的等待

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

讓主線程sleep一下,顯示一下如果主線程要等待守護(hù)線程,那么是并行的等待:

import threading,timeclass MyTread(threading.Thread): def __init__(self,name): super(MyTread,self).__init__() self.name=name def run(self): print('守護(hù)線程已經(jīng)啟動',self.name) time.sleep(1) print('run in task',self.name,threading.current_thread(),threading.active_count())t1=MyTread('t1')t1.setDaemon(True)t2=MyTread('t2')t2.setDaemon(True)start_time=time.time()#開始時間t1.start()t2.start()time.sleep(2)spend_time=time.time()-start_timeprint(spend_time)##2.0多,而且三個線程都執(zhí)行完畢了,說明這個是并行的等待

Python多線程Threading、子線程與守護(hù)線程實(shí)例詳解

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計(jì)入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 有码日韩 | 国产美女一区精品福利视频 | 国内精品久久影视 | 国产欧美一区二区久久 | 91精品成人福利在线播放 | 香蕉tv亚洲专区在线观看 | 国产第一亚洲 | 久久视频6免费观看视频精品 | 精品国产成人综合久久小说 | 欧美一级片免费在线观看 | 欧美午夜免费一级毛片 | 国产乱子伦在线观看不卡 | 国产婷婷成人久久av免费高清 | 欧美成人ass | 国内精品一区二区三区最新 | 久久亚洲精品23p | 欧美一做特黄毛片 | 日韩亚洲欧美一区噜噜噜 | 国产欧美在线观看不卡一 | 久久精品视频5 | 精品欧美一区二区精品久久 | 国产成人精品视频免费大全 | 91精品观看91久久久久久 | 波多野结衣3女同在线观看 波多野结衣aⅴ在线 | 亚洲日本欧美综合在线一 | 韩国一级黄色毛片 | 欧美一级毛片高清免费观看 | 久草免费色站 | 韩国毛片免费看 | 国产亚洲精品线观看77 | 韩国成人毛片aaa黄 韩国福利一区 | 手机看片神马午夜片 | tube69xxx最新片| 久草视频精品 | 九九干| 国产亚洲一区二区三区在线观看 | 久久国产精品一国产精品 | 黄色三级欧美 | 亚洲国产成人va在线观看网址 | 欧美成人免费高清二区三区 | 无限资源中文免费 |