上一篇文章: Python線程專題8:使用鎖的注意事項
下一篇文章: Python線程專題10:queue、多線程按順序執行
線程沒有任何方法可用於強制終止或掛起。這是設計上的緣由,由於編寫線程程序自己十分複雜。例如:若是某個線程已經獲取了鎖,在它可以釋放鎖以前強制終止或掛起它,將致使整個應用程序出現死鎖。此外,終止時通常不能簡單的【釋放全部的鎖】,由於複雜的線程同步常常涉及鎖定和清楚鎖定操做,而這些操做在執行時的次序要十分精確。segmentfault
若是要爲終止或掛起提供服務,須要本身構建這些功能。通常的作法是在循環中運行線程,這個循環的做用是按期檢查線程的狀態以決定它是否應該終止。例如:
from threading import Thread,Lock class StoppableThread(Thread): def __init__(self): Thread.__init__(self) self._terminate=False self._suspend_lock=Lock() def terminate(self): self._terminate=True def suspend(self): self._suspend_lock.acquire() def resume(self): self._suspend_lock.release() def run(self): while True: if self._terminate: break self._suspend_lock.acquire() self._suspend_lock.release() ...
要記住,要讓這種方法可靠的工做,線程應該千萬當心不要執行任何類型的阻塞I/O操做。例如,若是線程阻塞等待數據到達,那麼它會直到該操做被喚醒時纔會終止。所以,你須要在實際中使用超時、非阻塞I/O和其它高級功能,從而確保終止檢查執行的頻率足夠。多線程
函數名 | 解釋 |
---|---|
active_count() | 返回當前活動的Thread對象數量。 |
current_thread() | 返回該函數調用者所在的線程的Thread對象。 |
enumerate() | 列出當前全部活動的Thread對象 |
local() | 返回local對象,用於保存線程本地的數據。應該保證此對象在每一個線程中是惟一的。 |
setprofile(func) | 設置一個配置文件函數,用於已建立的全部線程。func在每一個線程開始運行以前被傳遞給sys.setprofile()函數。 |
settrace(func) | 設置一個跟蹤函數,用於已建立的全部線程。func在每一個線程開始運行以前被傳遞給sys.settrace()函數。 |
stack_size(size) | 返回建立新線程時使用的棧大小。可選的整數參數size表示建立新線程時使用的棧大小。size的值能夠是32768(32kb)或更大,並且是4096(4kb)的倍數,這樣可移植性更好。若是系統上不支持此操做,將引起ThreadError異常。 |