欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年03月24日 09:54:03   作者:隨風(fēng)行云  
這篇文章主要介紹了Python多線程Threading、子線程與守護(hù)線程,結(jié)合實(shí)例形式詳細(xì)分析了Python多線程Threading、子線程與守護(hù)線程相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下

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

線程與進(jìn)程:

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

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

    image


  • 線程Threading:

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

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

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

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

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

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

    import threading,time
    
    def 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()#開(kāi)始時(shí)間
    t1.start()
    t2.start()
    ##因?yàn)槭仟?dú)立線程,如果想要主線程等待其他線程運(yùn)行完畢,需要使用join
    t1.join()
    t2.join()
    spend_time=time.time()-start_time
    print(spend_time)##1.0多,說(shuō)明是并行的結(jié)果

    附加說(shuō)明--join是阻塞等待:

    import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#調(diào)用父類(lèi)的__init__()
      self.name=name
     def run(self):#重寫(xiě)方法,按自己的要求去寫(xiě)
      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é)束后才會(huì)向下執(zhí)行

    2.繼承threading的Thread類(lèi):

    繼承threading的Thread類(lèi)的類(lèi)要主要做兩件事:

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

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

  • import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#調(diào)用父類(lèi)的__init__()
      self.name=name
     def run(self):#重寫(xiě)方法,按自己的要求去寫(xiě)
      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多,證明是并行的


    子線程:

    • 由一個(gè)線程啟動(dòng)的線程可以成為它的子線程,A啟動(dòng)B,B是A的子線程,A是B的父線程


    線程的幾個(gè)常用函數(shù):

    • threading.current_thread():
    返回當(dāng)前正在運(yùn)行的線程對(duì)象
    image
    • threading.active_count():
    返回當(dāng)前進(jìn)程中的存活的線程對(duì)象數(shù)

    image

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

    image

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

    image

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


    守護(hù)線程:

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

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

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守護(hù)線程已經(jīng)啟動(dò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()#開(kāi)始時(shí)間
    t1.start()
    t2.start()
    
    spend_time=time.time()-start_time
    print(spend_time)##0.0多,而且三個(gè)線程都執(zhí)行完畢了,說(shuō)明這個(gè)是并行的等待

    image

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

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守護(hù)線程已經(jīng)啟動(dò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()#開(kāi)始時(shí)間
    t1.start()
    t2.start()
    time.sleep(2)
    spend_time=time.time()-start_time
    print(spend_time)##2.0多,而且三個(gè)線程都執(zhí)行完畢了,說(shuō)明這個(gè)是并行的等待

    image

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

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

相關(guān)文章

  • Pandas-Cookbook 時(shí)間戳處理方式

    Pandas-Cookbook 時(shí)間戳處理方式

    今天小編就為大家分享一篇Pandas-Cookbook 時(shí)間戳處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • python用戶管理系統(tǒng)的實(shí)例講解

    python用戶管理系統(tǒng)的實(shí)例講解

    下面小編就為大家分享一篇python用戶管理系統(tǒng)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Python模塊對(duì)Redis數(shù)據(jù)庫(kù)的連接與使用講解

    Python模塊對(duì)Redis數(shù)據(jù)庫(kù)的連接與使用講解

    這篇文章主要介紹了Python模塊對(duì)Redis數(shù)據(jù)庫(kù)的連接與使用,通過(guò)實(shí)例代碼給大家介紹了Python連接Redis數(shù)據(jù)庫(kù)方法,Python使用連接池連接Redis數(shù)據(jù)庫(kù)方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Python加密模塊的hashlib,hmac模塊使用解析

    Python加密模塊的hashlib,hmac模塊使用解析

    這篇文章主要介紹了Python加密模塊的hashlib,hmac模塊使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • linecache模塊加載和緩存文件內(nèi)容詳解

    linecache模塊加載和緩存文件內(nèi)容詳解

    這篇文章主要介紹了linecache模塊加載和緩存文件內(nèi)容詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python處理JSON數(shù)據(jù)并生成條形圖

    Python處理JSON數(shù)據(jù)并生成條形圖

    本文詳細(xì)介紹如何利用Python進(jìn)行數(shù)據(jù)分析,嘗試處理一份JSON數(shù)據(jù)并生成條形圖的過(guò)程,有需要的朋友們可以參考學(xué)習(xí)。
    2016-08-08
  • python redis存入字典序列化存儲(chǔ)教程

    python redis存入字典序列化存儲(chǔ)教程

    這篇文章主要介紹了python redis存入字典序列化存儲(chǔ)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Python新手最容易踩的坑及避坑指南

    Python新手最容易踩的坑及避坑指南

    學(xué)習(xí)Python時(shí)新手可能會(huì)遇到縮進(jìn)錯(cuò)誤、忘記引入模塊、使用未定義的變量、變量作用域理解不當(dāng)、字符串格式化錯(cuò)誤等問(wèn)題,本文詳細(xì)介紹了這些常見(jiàn)陷阱及其解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Python實(shí)現(xiàn)單例模式的四種方法

    Python實(shí)現(xiàn)單例模式的四種方法

    在Python中實(shí)現(xiàn)單例模式,意味著一個(gè)類(lèi)只能創(chuàng)建一個(gè)實(shí)例,單例模式在某些場(chǎng)景下非常有用,比如當(dāng)你需要控制資源的訪問(wèn),或者當(dāng)你想確保全局只有一個(gè)對(duì)象實(shí)例時(shí),本文給大家介紹了幾種在Python中實(shí)現(xiàn)單例模式的方法,需要的朋友可以參考下
    2024-03-03
  • Python反編譯的兩種實(shí)現(xiàn)方式

    Python反編譯的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了Python反編譯的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論