Python多線程的建立,相關函數和守護線程的理解

來源:互聯網
上載者:User

標籤:

一:多線程的建立

    threading庫建立線程有兩種方式,函數式和繼承式
    1)函數式

  • def func():

  •     print ‘Starting‘

  •     print ‘Ending‘

  •  

  • t=threading.Thread(name=‘func‘,target=func)

  • t.start()

 

    2)繼承式

  • class ThreadClass(threading.Thread):

  •     def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):

  •         threading.Thread.__init__(self, group, target, name, args, kwargs)

  •  

  •     def run(self):

  •         print ‘Starting‘

  •         print ‘Ending‘

  •  

  • t = ThreadClass()

  • t.start()

        

        Thread類的建構函式定義如下:

        class threading.Thread(group=Nonetarget=Nonename=Noneargs=()kwargs={})

        group:留作ThreadGroup擴充使用,一般賦值NULL

        target:就是建立線程要執行的任務函數名

        name:線程的名字,也可使用getName(),setName()擷取或者修改

        args:tuple參數

        kwargs:dictionary參數

 

二:相關函數

    1)start():啟動線程;

    2)join():主線程阻塞住,等待調用該函數的線程結束。join的參數是一個數字,如果非零就表示在此時間後,如果調用join的線程沒有結束join函數也返回;

    3)is_alive(), isAlive(),判斷線程是否結束;

    4)setDaemon(),設定函數為守護線程

 

  • class ThreadClass(threading.Thread):

  •     def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):

  •         threading.Thread.__init__(self, group, target, name, args, kwargs)

  •  

  •     def run(self):

  •        while True:

  •             dosometing()......

  •  

  • t = ThreadClass()

  • t.setDaemon(True)

  • t.start()                                                                                                                       

  •                                                                                                                                            

  • while True:                                                                                                                            

  •     if not t.is_alive():                                                                                                        

  •         print "t is dead"                                                                                                       

  •         exit(1)                                                                                                                         

  •  

  •     time.sleep(60)                                                                                                                     

  •                                                                                                                                            

  • t.join()

 

三:守護線程

    守護線程的概念有點不同於Linux環境下的概念,可能是我沒理解,但是這個概念和Java裡的守護線程一樣:

    守護線程在主線程退出後也會隨著退出,非守護線程則不會。什麼意思呢?

    對於普通線程,如果線程的任務沒有結束,主線程不會退出,整個程式也不會退出;

    對於守護線程,即使線程任務還沒有結束,如果主線程退出該線程也會退出;

(不知道這樣的理解對不對,實驗一下)

  • #--encoding=‘utf-8‘--

  • import logging

  • import threading

  • import time

  •  

  • logging.basicConfig(

  •     level=logging.DEBUG,

  •     format=‘(%(threadName)-10s) %(message)s‘,

  • )

  •  

  • def ThreadFunc():

  •     logging.debug(‘ Starting‘)

  •     file_object = open(‘thefile.txt‘, ‘w+‘)

  •     while True:

  •         file_object.write(‘wahaha\r\n‘)

  •         file_object.flush()

  •         time.sleep(1)

  •     logging.debug(‘ Existing‘)

  •     file_object.close( )

  •  

  • t=threading.Thread(name=‘ThreadFunc‘,target=ThreadFunc)

  • #t.setDaemon(True)

  •  

  • t.start()

  • time.sleep(5)

 

    1)首先注釋掉d.setDaemon(True),也就是d是一個普通線程

          執行之後,主線程本該在5秒後退出,但是卻發現該線程還是不斷的輸入wahaha,該指令碼一直運行直到kill掉改指令碼的執行。此時Ctrl+c也無效,只有kill。

    2)刪除d.setDaemon(True)前面的#,也就是d是一個守護線程

          執行之後,主線程在5秒後退出,線程d只輸出少於五個wahah之後也隨著主線程的退出而退出,整個指令碼退出。在退出前Ctrl+c有效。

Python多線程的建立,相關函數和守護線程的理解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.