執行緒程序協程併發
阿新 • • 發佈:2021-10-13
- GIL global interpreter lock (cpython) 全域性直譯器
- python 中的一個執行緒對應於C 語言中的一個執行緒
- gil 使得同一個時刻只有一個執行緒在一個CPU 上執行位元組碼,無法將多個執行緒對映到多個CPU 上執行
- GIL會根據執行的位元組碼行數以及時間片釋放GIL ,GIL 在遇到IO 操作時主動釋放
- 併發並行
- 併發:
- 一個時間段內,有幾個程式同時在一個CPU 上執行,但是任意時刻只有一個程式在CPU 上執行
- 並行
- 任意時間點上,有多個程式同執行在多個CPU 上,並行數與CPU 數一致
- 併發:
- 同步非同步
- 同步
- 同步是指程式碼呼叫IO操作時,必須等待IO操作完成才返回的呼叫方式
- 非同步
- 非同步是指程式碼呼叫IO 操作時,不必等IO 操作完成就返回的呼叫 方式
- 同步
- 阻塞、非阻塞
- 阻塞是指呼叫函式時後當前執行緒被掛起
- 非阻塞是指呼叫函式時候在當前執行緒不會被掛起,而是立即返回
- Unix下五種I/O 模型
- 阻塞式I/O
- 非阻塞式I/O
- I/O 複用
- 訊號驅動式I/O
- 非同步i/o(POSIX的aio系列函式)
- 阻塞式I/O
- select、pool、epoll
- select、poll\epoll 都是IO 多路複用的機制。I/O 多路複用就是通過一種機制,一個程序可以監控多個描述符,一旦某個描述符就緒(一般是都就緒或者寫就緒),能夠通知程式 進行相應的讀寫操作,但select,poll,epoll 本質上都是同步I/O,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而非同步I/O 則無需自己負責進行讀寫,非同步I/O的實現會負責把資料從核心拷貝到使用者空間
- select
- poll
- epoll
-
#1. epoll 並不一定比select好
#在併發高的情況下,連線活躍度不是很高,epoll 比select 好
#併發不高,同時連線很活躍,select 比epoll 好
- C10M問題
- 如何利用8核CPU 64G 記憶體,在10gbps 的網路上保持1000萬併發連線
-
什麼是協程
- 解決問題
- 回撥模式編碼複雜度高
- 同步程式設計的併發性不高
- 多執行緒程式設計需要執行緒同步,lock
- 方法
- 採用同步的方式去編寫非同步的程式碼
- 採用單執行緒去切換任務
- 執行緒是由作業系統切換 的,單執行緒以為著我們需要程式設計師自己去排程任務
- 不再需要鎖,併發性高,如果單執行緒內切換函式,效能遠高於執行緒切換,併發性高
asyncio 非同步IO - 解決問題
- 包含各種 特定系統實現的模組化事件迴圈
- 輸出和協議抽象
- 對 tcp 、UDP、SSL、子程序,延時呼叫以及其他的具體支援
- 模仿futures模組但適用於事件迴圈使用的Future類
- 基於yield from 的協議和任務,可以讓你用順序的方式編寫併發程式碼
- 必須使用一個將產生阻塞IO 的呼叫時,有介面可以把這個事件轉移到執行緒池
- 模仿threading 模組中的同步原語、可以用在單執行緒內的協程之間
- q