python 多執行緒

2022-04-11 05:22:34 字數 2035 閱讀 1106

在非python環境中,單核情況下,同時只能有乙個任務執行。多核時可以支援多個執行緒同時執行。

在python中,無論有多少核,同時只能執行乙個執行緒,這是由於gil所導致的。

gil(global interpreter lock全域性直譯器鎖),是為了資料安全所做的決定,某個執行緒想要執行,必須先拿到gil,我們可以把gil看作是「通行證」。

在乙個python程序中,gil只有乙個

拿不到gil的執行緒,就不允許進入cpu執行

python3.x中,改為使用計時器(當執行時間達到閾值後,當前執行緒釋放gil)

釋放gil鎖後,執行緒會進行鎖競爭,隨後切換執行緒,會消耗資源

由於python裡乙個程序永遠只能同時執行乙個執行緒(拿到gil的執行緒才能執行),所以在多核cpu上,python的多執行緒效率並不高

1.拿到公共資料

2.申請gil

3.python直譯器呼叫os原生執行緒

4.os操作cpu執行運算

5.當該執行緒達到gil的釋放要求時,無論運算是否已經執行完,gil都被要求釋放

6.其他執行緒重複上面的過程

7.輪到之前的執行緒時,又會切換到之前的執行緒(從它記錄的上下文繼續執行)

整個過程是每個執行緒執行自己的運算,當執行時間到,就進行切換。

互斥鎖的好處就是確保了某段關鍵**只能由乙個執行緒從頭到尾完整地執行

rlock允許在同一執行緒中被多次acquire。而lock卻不允許這種情況。

訊號量semaphore本質也是一把鎖,但是這把鎖可以限定允許多個任務同時執行任務,但是不能超出規定的限制,如(semaphore(5))引數5就代表可以執行5個任務,如果第6個任務要執行,必須等5個任務中的乙個結束,然後第六個才能進入執行。

可以把condiftion理解為一把高階的瑣,允許我們能夠控制複雜的執行緒同步問題。

wait方法釋放內部所占用的瑣,同時執行緒被掛起,直至接收到通知被喚醒或超時(如果提供了timeout引數的話)。當執行緒被喚醒並重新占有瑣的時候,程式才會繼續執行下去。

notify()、notify_all()、notifyall()會喚醒所有掛起的執行緒(如果存在掛起的執行緒)。注意:這些方法不會釋放所占用的瑣。

事件處理的機制:全域性定義了乙個「flag」,當flag值為「false」,那麼event.wait()就會阻塞,當flag值為「true」,那麼event.wait()便不再阻塞。

用於某執行緒控制其他執行緒的執行

主要有佇列queue、堆疊queue、優先順序queue三種

當我們使用setdaemon(true)方法,設定子執行緒為守護執行緒時,主線程一旦執行結束,則全部執行緒全部被終止執行。

守護程序可能出現的情況就是,子執行緒的任務還沒有完全執行結束,就被迫停止。

如果要避免上面的情況,就要使用join(),join所完成的工作就是執行緒同步,即主線程任務結束之後,進入阻塞狀態,一直等待其他的子執行緒執行結束之後,主線程再終止

乙個threadlocal變數雖然是全域性變數,但每個執行緒都只能讀寫自己執行緒的獨立副本,互不干擾。threadlocal解決了引數在乙個執行緒中各個函式之間互相傳遞的問題。

原理:, ... }

可以理解為全域性變數local_school是乙個dict,不但可以用local_school.student,還可以繫結其他變數,如local_school.teacher等等。

threadlocal最常用的地方就是為每個執行緒繫結乙個資料庫連線,http請求,使用者身份資訊等,這樣乙個執行緒的所有呼叫到的處理函式都可以非常方便地訪問這些資源。

定時器,指定n秒後執行某操作,注:是與當前執行緒非同步的

系統處理任務時,需要為每個請求建立和銷毀物件。當有大量併發任務需要處理時,再使用傳統的多執行緒就會造成大量的資源建立銷毀導致伺服器效率的下降。這時候,執行緒池就派上用場了。執行緒池技術為執行緒建立、銷毀的開銷問題和系統資源不足問題提供了很好的解決方案。

使用見參考資料

python3之多執行緒gil、同步鎖、訊號量、死鎖與遞迴鎖、執行緒queue、event、定時器

python中lock和rlock(遞迴鎖)的區別、condition

python3執行緒間通訊

執行緒池python

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...

python多執行緒詳解 Python多執行緒詳解

前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...

python程式多執行緒 PYTHON多執行緒

在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...