1. 程式人生 > >Python多執行緒(1)——介紹

Python多執行緒(1)——介紹

轉自:http://www.cnblogs.com/Security-Darren/p/4732842.html 

Python對多執行緒提供了很好的支援,Python中多執行緒相關的模組包括:thread,threading,Queue。可以方便地支援建立執行緒、互斥鎖、訊號量、同步等特性。

  1. thread:多執行緒的底層支援模組,除了其中提供的 Lock 原語外,一般不建議使用。

  2. threading:基於 thread 模組,將一些執行緒的操作物件化,該模組提供下列類:

      • Thread,執行緒類
      • Timer,與Thread類似,但要等待一段時間後才開始執行
      • Lock,鎖原語,和 thread 模組提供的 Lock 相同
      • RLock,可重入鎖。使單執行緒可以再次獲得已經獲得的鎖
      • Condition,條件變數,能讓一個執行緒停下來,等待其他執行緒滿足某個“條件”
      • Event,通用的條件變數。多個執行緒可以等待某個事件發生,在事件發生後,所有的執行緒都被啟用
      •   Semaphore,為等待鎖的執行緒提供一個類似“等候室”的結構
      3. Queue:實現了多生產者(Producer)、多消費者(Consumer)的佇列,支援鎖原語,能夠在多個執行緒之間提供很好的同步支援。提供的類:
      •    

        Queue佇列

      • LifoQueue後入先出(LIFO)佇列

      • PriorityQueue 優先佇列

Python執行緒系列包括以下部分:

  本文將介紹Python執行緒中的主角,threading.Thread 物件。

Thread in Python

1.1 Thread物件的建立

  通過例項化Thread型別獲得一個Thread物件:

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

  引數的含義:

  •   name:新執行緒的名稱,如果沒有指定,python會為其生成一個隨機的唯一名稱;
  •   target:新執行緒中將要執行的函式;t.run() 會呼叫 target(*args, **kwargs)
  •   args和kwargs:這是傳遞給執行緒中執行的主函式 target 的引數,當執行緒開始執行時,將會以這些引數呼叫執行主函式 target()。

1.2 Thread物件的方法

1 t.getName()

  返回執行緒當前的名字。

1 t.setName(name)

  設定執行緒的名字,執行緒的名稱並不要求唯一。

1 t.isAlive()

  判斷這個執行緒是否還在執行中(active)——已經呼叫了start() 而 run() 還沒有執行結束。

1 t.isDaemon()

  判斷執行緒是不是一個daemon執行緒,初始狀態下,執行緒 t1 只有在建立自己的執行緒 t0 是daemon時,自己才是daemon的。

1 t.setDaemon(daemonic)

  把執行緒的daemon標誌設為daemonic(真或假)

  daemon 執行緒是指,即使這個執行緒 t 的狀態是 active,Python也可以終止 t(可能是通過終止 t 所在的程序);非daemon執行緒沒有終止前,Python會一直保持執行直到其終止。

  setDaemon()需要在start()之前呼叫。

1 t.join(timeout=None)

  這個函式需要注意,比如在一個執行緒 t1 的執行流程中呼叫 t2.join(),則 t1 阻塞直到 t2 執行緒執行結束,如果指定 timeout,則 t1 最多阻塞timeout秒,否則 t1 將一直等下去。

  join()只能在start()之後呼叫;

1 t.run()

  執行緒通過 run() 呼叫傳入的主函式 target,不要直接呼叫run(),而是呼叫start()函式,start()函式會呼叫run()。

1 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終止。