Python中的基於執行緒的並行性


在計算機科學中,執行緒是一組可以由排程程式(作業系統的一部分)獨立管理的指令。

執行緒的主要功能是同時執行多個執行緒。執行緒指的是程式中的不同任務、函式呼叫,多個執行緒同時執行並不意味著它們在不同的機器上執行。

多執行緒用於兩種情況。

  • 當子程式的輸出需要與主程式組合時。

  • 當主程式包含彼此相對獨立的程式碼段時。

執行緒模組

Python 提供了 threading 模組,它非常強大,併為執行緒提供了高階支援。

threading 模組定義了許多用於獲取執行緒相關資料的函式,這些函式會自動執行。

threading.active_count()

此函式返回當前存活的 Thread 物件的數量。這裡返回的計數等於 enumerate() 返回的列表的長度。

threading.current_thread()

此函式返回當前的 Thread 物件,它對應於呼叫者的執行緒控制。

threading.get_ident()

此函式返回當前執行緒的“執行緒識別符號”。這是一個非零整數。

threading.enumerate()

此函式返回當前存活的所有 Thread 物件的列表,包括守護執行緒,current_thread() 函式建立一個虛擬執行緒和主執行緒,並排除已終止的執行緒和尚未啟動的執行緒。

threading.main_thread()

此函式返回主 Thread 物件。

threading.settrace(func)

當所有執行緒都從 threading 模組啟動時,設定一個跟蹤函式。在呼叫 run() 方法之前,此函式將傳遞給每個執行緒的 sys.settrace()。

threading.setprofile(func)

當所有執行緒都從 threading 模組啟動時,設定一個概要分析函式。在呼叫 run() 方法之前,此函式將傳遞給每個執行緒的 sys.setprofile()。

threading.stack_size([size])

此函式返回執行緒堆疊的大小,它用於建立新執行緒時。

threading.TIMEOUT_MAX

這是一個常量,它具有阻塞函式(Lock.acquire()、RLock.acquire()、Condition.wait() 等)的超時引數允許的最大值。

示例程式碼

import threading
def trace_function():
   print("Passing the trace function")
   def profile():
      print("PROFILE THREAD: " + str(threading.current_thread().getName()))
      class mythread(threading.Thread):
      def __init__(self, thread_name, thread_ID):
         threading.Thread.__init__(self)
         self.thread_name = thread_name
         self.thread_ID = thread_ID
      def run(self):
         print(str(self.thread_ID));
         print("ACTIVE THREADS ARE: "+ str(threading.active_count()))
         print("CURRENT THREAD IS: " + str(threading.current_thread().getName()))
         my_thread1 = mythread("PP", 500)
         my_thread2 = mythread("PythonProgram", 1000);
         print("NAME OF THE MAIN THREAD: " + str(threading.main_thread().getName()))
         print("IDENTIFICATION OF MAIN THREAD: "+ str(threading.get_ident()))
         print("STACK SIZE = " + str(threading.stack_size()))
      print(threading.settrace(trace_function()))
   threading.setprofile(profile())
my_thread1.start()
my_thread2.start()
print("LIST OF ENUMERATION: ")
print(threading.enumerate())
print("EXIT")

輸出

NAME OF THE MAIN THREAD: MainThread
IDENTIFICATION OF MAIN THREAD: 5436
STACK SIZE = 0
Passing the trace function
None
PROFILE THREAD: MainThread
500
1000LIST OF ENUMERATION: ACTIVE THREADS ARE: 6
[<_MainThread(MainThread, started 5436)>, <Thread(Thread-4, started daemon 1960)>, <Heartbeat(Thread-5, started daemon 6452)>, <HistorySavingThread(IPythonHistorySavingThread, started 4304)>, <mythread(Thread-8, started 8460)>, <mythread(Thread-9, started 4668)>]
EXIT

CURRENT THREAD IS: Thread-8

ACTIVE THREADS ARE: 5
CURRENT THREAD IS: Thread-9

更新於:2020年6月26日

362 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告