Python多線程(1)——介紹

  Python對多線程提供了很好的支持,Python中多線程相關的模塊包括:thread,threading,Queue。能夠方便地支持建立線程、互斥鎖、信號量、同步等特性。html

  1. thread:多線程的底層支持模塊,除了其中提供的 Lock 原語外,通常不建議使用。python

  2. threading:基於 thread 模塊,將一些線程的操做對象化,該模塊提供下列類:編程

      • Thread,線程類
      • Timer,與Thread相似,但要等待一段時間後纔開始運行
      • Lock,鎖原語,和 thread 模塊提供的 Lock 相同
      • RLock,可重入鎖。使單線程能夠再次得到已經得到的鎖
      • Condition,條件變量,能讓一個線程停下來,等待其餘線程知足某個「條件」
      • Event,通用的條件變量。多個線程能夠等待某個事件發生,在事件發生後,全部的線程都被激活
      •   Semaphore,爲等待鎖的線程提供一個相似「等候室」的結構
      3. Queue:實現了多生產者(Producer)、多消費者(Consumer)的隊列,支持鎖原語,可以在多個線程之間提供很好的同步支持。提供的類:
      •   

        Queue隊列多線程

      • LifoQueue後入先出(LIFO)隊列函數

      • PriorityQueue 優先隊列spa

 

Python線程系列包括如下部分:線程

  第1篇——Thread對象htm

  第2篇——經常使用的線程同步機制對象

  第3篇——Queue模塊與線程編程blog

  本文將介紹Python線程中的主角,threading.Thread 對象。

 

Thread in Python

1.1 Thread對象的建立

  經過實例化Thread類型得到一個Thread對象:

threading.Thread(name=None, target=None, args=(), kwargs={})

  參數的含義:

  •   name:新線程的名稱,若是沒有指定,python會爲其生成一個隨機的惟一名稱;
  •   target:新線程中將要執行的函數;t.run() 會調用 target(*args, **kwargs)
  •   args和kwargs:這是傳遞給線程中運行的主函數 target 的參數,當線程開始運行時,將會以這些參數調用執行主函數 target()。

 

1.2 Thread對象的方法

t.getName()

  返回線程當前的名字。

  

t.setName(name)

  設置線程的名字,線程的名稱並不要求惟一。

  

t.isAlive()

  判斷這個線程是否還在運行中(active)——已經調用了start() 而 run() 尚未執行結束。

 

t.isDaemon()

  判斷線程是否是一個daemon線程,初始狀態下,線程 t1 只有在建立本身的線程 t0 是daemon時,本身才是daemon的。

 

t.setDaemon(daemonic)

  把線程的daemon標誌設爲daemonic(真或假)

  daemon 線程是指,即便這個線程 t 的狀態是 active,Python也能夠終止 t(多是經過終止 t 所在的進程);非daemon線程沒有終止前,Python會一直保持運行直到其終止。

  setDaemon()須要在start()以前調用。

 

t.join(timeout=None)

  這個函數須要注意,好比在一個線程 t1 的執行流程中調用 t2.join(),則 t1 阻塞直到 t2 線程執行結束,若是指定 timeout,則 t1 最多阻塞timeout秒,不然 t1 將一直等下去。

  join()只能在start()以後調用;

 

t.run()

  線程經過 run() 調用傳入的主函數 target,不要直接調用run(),而是調用start()函數,start()函數會調用run()。

 

t.start()

  開始線程執行

  

Python線程運行的流程

  1. 建立一個線程 t= threading.Thread(),此時新建立的線程並不會當即執行;

  2. 若是想要將 t 設置爲守護線程,在調用 t.start() 以前調用 t.setDaemon(True);不然忽略本步;

  3. 調用 t.start(),此時線程開始執行,狀態更新爲 active。更具體的,start() 會進一步調用 run() 函數,run() 函數再去調用建立線程對象時傳入的主函數 target,從而讓線程有了執行的具體內容;

  4. 當線程中的主函數執行完成或遇到未處理的異常時,線程終止執行;daemon線程也可能由於所在進程終止而被Python終止。

相關文章
相關標籤/搜索