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