python Event_loop(事件循環)


由於GIL全局解釋器鎖的存在,意味着在任何一個時刻,只有一個線程處於執行狀態。

(1)執行棧:

因為python是單線程的,同一時間只能執行一個方法,所以當一系列的方法被依次調用的時候,python會先解析這些方法,把其中的同步任務按照執行順序排隊到一個地方,這個地方叫做執行棧。

 

(2)事件隊列(任務隊列):

主線程之外,還存在一個"任務隊列"(task queue)。當遇到異步任務時,異步任務會被掛起,繼續執行執行棧中任務,等異步任務返回結果后,再按照執行順序排列到‘’事件隊列中‘’。

 

(3)一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。如果有,就將第一個事件對應的回調推到執行棧中執行,若在執行過程中遇到異步任務,則繼續將這個異步任務排列到事件隊列中。

 

(4)主線程每次將執行棧清空后,就去事件隊列中檢查是否有任務,如果有,就每次取出一個推到執行棧中執行,這個過程是循環往復的... ...,這個過程被稱為“Event Loop 事件循環”。

注:

"任務隊列"是一個先進先出的數據結構,排在前面的事件,優先被主線程讀取。主線程的讀取過程基本上是自動的,只要執行棧一清空,"任務隊列"上第一位的事件就自動進入主線程。

所謂"回調函數"(callback),就是那些會被主線程掛起來的代碼。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。

"任務隊列"中的事件,除了IO設備的事件以外,還包括一些用戶產生的事件(比如鼠標點擊、頁面滾動等等)。只要指定過回調函數,這些事件發生時就會進入"任務隊列",等待主線程讀取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM