溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中多線程Threading、子線程與守護線程的示例分析

發(fā)布時間:2021-06-04 15:00:49 來源:億速云 閱讀:198 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹了Python中多線程Threading、子線程與守護線程的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

線程與進程:

  • 線程對于進程來說,就好似工廠里的工人,分配資源是分配到工廠,工人再去處理。

  • 線程是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。

  • 在單個程序中同時運行多個線程完成不同的工作,稱為多線程

  • 對于IO密集型的程序來說,多線程可以利用讀IO的時間去做其他事【IO并不占用CPU,這就好像A買個一份外賣,他只需要等著送過來然后敲A家的門就行了】;

  • 而對于CPU密集型的程序來說,多線程的效率就不是很高了【CPU由于要計算,切換之間要恢復之前的現(xiàn)場消耗相對較大,比如我同時做幾份作業(yè),一份作業(yè)做十分鐘,假如十分鐘做不完一份作業(yè),那么我后面再回頭做的時候,我就要好好想想剛才做到哪,剛才想到哪

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

    Python中多線程Threading、子線程與守護線程的示例分析




  • 線程Threading:

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

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

    1.直接調用threading的Thread類:

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

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

    讓主線程等待其余線程結束:線程對象.join(),加了join之后,相當于阻塞了主線程,主線程只有當join的線程結束后才會向下執(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()#開始時間
    t1.start()
    t2.start()
    ##因為是獨立線程,如果想要主線程等待其他線程運行完畢,需要使用join
    t1.join()
    t2.join()
    spend_time=time.time()-start_time
    print(spend_time)##1.0多,說明是并行的結果

     

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

    import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#調用父類的__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)###主線程等待其余線程結束
    print(time.time()-start_time)
    #結果是2.0多,證明是join是相當于阻塞了主線程的執(zhí)行,只有當線程結束后才會向下執(zhí)行

     

    2.繼承threading的Thread類:

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

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

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

  • import threading,time
    
    class MyTread(threading.Thread):
     def __init__(self,name):
      super(MyTread,self).__init__()#調用父類的__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()
    print(time.time()-start_time)#結果是1.0多,證明是并行的

     




    子線程:




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

    返回當前正在運行的線程對象

     


     

    返回當前進程中的存活的線程對象數(shù)

     

    Python中多線程Threading、子線程與守護線程的示例分析

    Python中多線程Threading、子線程與守護線程的示例分析

    Python中多線程Threading、子線程與守護線程的示例分析

    • getName(): 返回線程名。

    • setName(): 設置線程名。

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

    • threading.active_count():

    • threading.current_thread():

    • 由一個線程啟動的線程可以成為它的子線程,A啟動B,B是A的子線程,A是B的父線程

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




    守護線程:

    下面的代碼顯示了主線程并不會等待其守護線程結束:

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守護線程已經啟動",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_time
    print(spend_time)##0.0多,而且三個線程都執(zhí)行完畢了,說明這個是并行的等待

     

    Python中多線程Threading、子線程與守護線程的示例分析

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

    import threading,time
    
    class MyTread(threading.Thread):
    
     def __init__(self,name):
      super(MyTread,self).__init__()
      self.name=name
     def run(self):
      print("守護線程已經啟動",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_time
    print(spend_time)##2.0多,而且三個線程都執(zhí)行完畢了,說明這個是并行的等待

     

    Python中多線程Threading、子線程與守護線程的示例分析

    • 守護線程是起到輔助功能的,就好像魔法師放禁咒總要騎士保護一樣【魔法師只需要關系自己的任務,保護他的任務交給守護者】

    • 而守護線程與主線程的關系呢,就好像備胎跟女神,去買東西的話,備胎要一直在外面等女神【守護線程運行結束就狗帶,但不影響主進程結束,由主線程決定運行時間】,女神不需要等待備胎【主線程結束,守護線程也要結束,不管自身任務是否完成】

    • 與join的區(qū)別:join是阻塞等待,守護線程是并行的等待

    • 設置守護線程:線程對象.setDaemon(True)【注意?。。。。≡O置守護線程必須要在start()前面,不然會報錯】

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python中多線程Threading、子線程與守護線程的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI