18.3 執行緒同步
18.4 執行緒佇列
18.5 習題
程式是一些列的指令集,程式是靜態的,當程式執行時,就會建立乙個程序。
執行緒是程序的基本執行單元,乙個程序至少要具有乙個執行緒。
多執行緒,就類似與作業系統中的多程序。簡單的講,就是可以同時併發執行多個任務,處理多件事情。
我們可以採用兩種方式來建立執行緒:
思考:直接呼叫run與呼叫start方法有什麼不同?
執行緒的生命週期:
執行緒的生命週期可以分為以下環節:
threading.active_count(
)threading.
enumerate()
threading.current_thread(
)threading.get_ident(
)threading.main_thread(
)
執行緒物件功能:
start(
)run(
)join(timeout=
none
)name setname / getname
ident
is_alive(
)daemon isdaemon(
)/ setdaemon(
)
當多執行緒併發執行時,多執行緒間很可能操作共享成員變數,此時,就需要對共享成員變數的操作進行同步,避免出現多執行緒的併發修改而引起的意外錯誤。
我們可以通過threading.lock()獲得執行緒鎖,來實現多個執行緒對共享區域的互斥訪問。執行緒鎖提供兩個方法:
注意:要確保鎖得到有效的釋放。
當兩個或多個執行緒同時擁有自己的資源,而相互等待獲得對方資源,導致程式永遠陷入僵持狀態,這就是死鎖。
當多執行緒併發訪問共享資料時,使用執行緒鎖可以避免多執行緒對共享變數併發修改帶來的危害,但同時有可能會產生死鎖。
queue模組提供了佇列的功能,該模組具有三個類:
佇列類實現了內部的鎖機制,因此,佇列型別可以安全的用於多執行緒併發操作中。
其中,引數maxsize表示佇列的最大元素個數,如果傳遞0或者負值,則表示無限容量。如果佇列達到了最大容量,將會進行阻塞,直到有元素刪除為止。
佇列物件具有的方法如下:
qsize(
)empty(
)full(
)put(item, block=
true
, timeout=
none
)put_nowait(item) put(item,
false
)get(block=
true
, timeout=
none
)get_nowait(
) get(
false
)
1.當建立乙個執行緒時,該執行緒是前台執行緒還是後台執行緒?用**驗證一下。
2.編寫兩個執行緒,對同乙個全域性變數增加若干次(次數多一點),會出現什麼情況。
3.兩個執行緒,使用同乙個函式作為target,然後在函式定義乙個區域性變數,兩個執行緒分別對該變數自增若干次,會出現什麼情況。
4.編寫買家與賣家交易的程式,乙個錢鎖,乙個貨鎖,並造成死鎖。
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...