1. 程式人生 > 程式設計 >Python多執行緒thread及模組使用例項

Python多執行緒thread及模組使用例項

多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點:

  • 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。
  • 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
  • 程式的執行速度可能加快
  • 在一些等待的任務實現上如使用者輸入、檔案讀寫和網路收發資料等,執行緒就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如記憶體佔用等等。

執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

每個執行緒都有他自己的一組CPU暫存器,稱為執行緒的上下文,該上下文反映了執行緒上次執行該執行緒的CPU暫存器的狀態。

指令指標和堆疊指標暫存器是執行緒上下文中兩個最重要的暫存器,執行緒總是在程序得到上下文中執行的,這些地址都用於標誌擁有執行緒的程序地址空間中的記憶體。

執行緒可以被搶佔(中斷)。

在其他執行緒正在執行時,執行緒可以暫時擱置(也稱為睡眠) -- 這就是執行緒的退讓。

執行緒可以分為:

核心執行緒:由作業系統核心建立和撤銷。

使用者執行緒:不需要核心支援而在使用者程式中實現的執行緒。

Python3 執行緒中常用的兩個模組為:

  • _thread
  • threading(推薦使用)

thread 模組已被廢棄。使用者可以使用 threading 模組代替。所以,在 Python3 中不能再使用"thread" 模組。為了相容性,Python3

將 thread 重新命名為 "_thread"。

Python中使用執行緒有兩種方式:函式或者用類來包裝執行緒物件。

函式式:呼叫 _thread 模組中的start_new_thread()函式來產生新執行緒。語法如下:

_thread.start_new_thread ( function,args[,kwargs] )

引數說明:

  • function - 執行緒函式。
  • args - 傳遞給執行緒函式的引數,他必須是個tuple型別。
  • kwargs - 可選引數。
import _thread
from time import sleep
import datetime

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop_one():
  print('++++執行緒一開始於:',date_time_str())
  print('++++執行緒一休眠4秒')
  sleep(4)
  print('++++執行緒一休眠結束,結束於:',date_time_str())
      
def loop_two():
  print('++++執行緒二開始於:',date_time_str())
  print('++++執行緒二休眠2秒')
  sleep(2)
  print('++++執行緒二休眠結束,結束於:',date_time_str())
      
def main():
  print('-----所有執行緒開始時間:',date_time_str())
  _thread.start_new_thread(loop_one,())
  _thread.start_new_thread(loop_two,())
  sleep(6)
  print('------所有執行緒結束時間:',date_time_str())
      
if __name__=='__main__':
  main()

執行結果:

[python@master thread]$ python3 thread.py
-----所有執行緒開始時間: 2018-11-08 19:07:54
++++執行緒一開始於: 2018-11-08 19:07:54
++++執行緒一休眠4秒
++++執行緒二開始於: 2018-11-08 19:07:54
++++執行緒二休眠2秒
++++執行緒二休眠結束,結束於: 2018-11-08 19:07:56
++++執行緒一休眠結束,結束於: 2018-11-08 19:07:58
------所有執行緒結束時間: 2018-11-08 19:08:00

sleep(6) 是讓主執行緒停下來,主執行緒一旦執行結束,就關閉執行著的其他兩個執行緒,這可能造成主執行緒過早或者過晚退出,這時就要用執行緒鎖,主執行緒可認在兩個子程序都退出後立即退出。程式碼如下:

import _thread
from time import sleep
import datetime

loops=[4,2]

def date_time_str():
  return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def loop(n_loop,n_sec,lock):
  print('執行緒(',n_loop,') 開始執行:',date_time_str(),',先休眠(',')秒')
  sleep(n_sec)
  print('執行緒(',')休眠結束,結束於:',date_time_str())
  lock.release()
def main():
  print('---所有執行緒開始執行...')
  locks=[]
  n_loops=range(len(loops))
  for i in n_loops:
    lock=_thread.allocate_lock()
    lock.acquire()
    locks.append(lock)
  for i in n_loops:
    _thread.start_new_thread(loop,(i,loops[i],locks[i]))
  for i in n_loops:
    while locks[i].locked():
     pass
  print('---所有執行緒執行結束:',date_time_str())
  
if __name__=='__main__':
  main()

執行結果:

[python@master thread]$ python3 thread2.py
---所有執行緒開始執行...
執行緒( 1 ) 開始執行: 2018-11-08 20:00:47,先休眠( 2 )秒
執行緒( 0 ) 開始執行: 2018-11-08 20:00:47,先休眠( 4 )秒
執行緒( 1 )休眠結束,結束於: 2018-11-08 20:00:49
執行緒( 0 )休眠結束,結束於: 2018-11-08 20:00:51
---所有執行緒執行結束: 2018-11-08 20:00:51

使用了執行緒鎖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。