python3核心語法練習題7 線程

題目1:如何讓程序暫停執行0.1秒

解答:很簡單,我們import time模塊,然後使用time.sleep(seconds)方法。

python3核心語法練習題7 線程

題目2:寫出一個方法,新建線程來執行它。

解答:使用threading模塊來建立新線程。

python3核心語法練習題7 線程

threading.Thread用於建立新線程:

python3核心語法練習題7 線程

其中常用的就是target,也就是你要用線程執行的那個方法。args是方法用的參數列表。name是指定當前線程的名字。

題目3:如何輸出當前線程的名字name。

解答:

python3核心語法練習題7 線程

題目4:給自己的程序上鎖,防止被拆開執行。

python3核心語法練習題7 線程

當多個線程同時執行lock.acquire()時,只有一個線程能成功地獲取鎖,然後繼續執行代碼,其他線程就繼續等待直到獲得鎖為止。

獲得鎖的線程用完後一定要釋放鎖,否則那些苦苦等待鎖的線程將永遠等待下去,成為死線程。所以我們用try...finally來確保鎖一定會被釋放。

鎖的好處就是確保了某段關鍵代碼只能由一個線程從頭到尾完整地執行,壞處當然也很多,首先是阻止了多線程併發執行,包含鎖的某段代碼實際上只能以單線程模式執行,效率就大大地下降了。其次,由於可以存在多個鎖,不同的線程持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖,導致多個線程全部掛起,既不能執行,也無法結束,只能靠操作系統強制終止。

題目5:使用threadlocal改寫下列程序,使showage和showname函數調用不再傳入參數。

python3核心語法練習題7 線程

解答:

python3核心語法練習題7 線程

我們知道多線程環境下,每一個線程均可以使用所屬進程的全局變量。如果一個線程對全局變量進行了修改,將會影響到其他所有的線程。為了避免多個線程同時對變量進行修改,引入了線程同步機制,通過互斥鎖,條件變量或者讀寫鎖來控制對全局變量的訪問。

只用全局變量並不能滿足多線程環境的需求,很多時候線程還需要擁有自己的私有數據,這些數據對於其他線程來說不可見。因此線程中也可以使用局部變量,局部變量只有線程自身可以訪問,同一個進程下的其他線程不可訪問。

有時候使用局部變量不太方便,因此 python 還提供了 ThreadLocal 變量,它本身是一個全局變量,但是每個線程卻可以利用它來保存屬於自己的私有數據,這些私有數據對其他線程也是不可見的。下圖給出了線程中這幾種變量的存在情況:

python3核心語法練習題7 線程

其實threadlocal的作用就類似一個全局字典,綁定的過程相當於向字典中加入鍵值對,而獲取的過程相當於從字典中讀取值。threadlocal更高級的地方是本線程只能訪問本線程的變量,更加線程安全。

這樣做的目的是使線程內的函數調用更加簡單。達到的結果就是我們例題中的current_thread().name的效果。

ThreadLocal最常用的地方就是為每個線程綁定一個數據庫連接,HTTP請求,用戶身份信息等,這樣一個線程的所有調用到的處理函數都可以非常方便地訪問這些資源。


分享到:


相關文章: