Python線程專題9:線程終止與掛起、實用工具函數

上一篇文章: 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異常。
相關文章
相關標籤/搜索