1. 程式人生 > 其它 >執行緒程序協程併發

執行緒程序協程併發

  1. GIL global interpreter lock (cpython) 全域性直譯器
    1.  python 中的一個執行緒對應於C 語言中的一個執行緒
    2. gil 使得同一個時刻只有一個執行緒在一個CPU 上執行位元組碼,無法將多個執行緒對映到多個CPU 上執行
    3. GIL會根據執行的位元組碼行數以及時間片釋放GIL ,GIL 在遇到IO 操作時主動釋放
  2. 併發並行
    1.  併發:
      1. 一個時間段內,有幾個程式同時在一個CPU 上執行,但是任意時刻只有一個程式在CPU 上執行
    2. 並行
      1. 任意時間點上,有多個程式同執行在多個CPU 上,並行數與CPU 數一致
  3. 同步非同步
    1. 同步
      1. 同步是指程式碼呼叫IO操作時,必須等待IO操作完成才返回的呼叫方式
    2. 非同步
      1. 非同步是指程式碼呼叫IO 操作時,不必等IO 操作完成就返回的呼叫 方式
  4. 阻塞、非阻塞
    1. 阻塞是指呼叫函式時後當前執行緒被掛起
    2. 非阻塞是指呼叫函式時候在當前執行緒不會被掛起,而是立即返回
  5. Unix下五種I/O 模型
    1. 阻塞式I/O
    2. 非阻塞式I/O
    3. I/O 複用
    4. 訊號驅動式I/O
    5. 非同步i/o(POSIX的aio系列函式)
  6. select、pool、epoll
    1. select、poll\epoll 都是IO 多路複用的機制。I/O 多路複用就是通過一種機制,一個程序可以監控多個描述符,一旦某個描述符就緒(一般是都就緒或者寫就緒),能夠通知程式 進行相應的讀寫操作,但select,poll,epoll 本質上都是同步I/O,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而非同步I/O 則無需自己負責進行讀寫,非同步I/O的實現會負責把資料從核心拷貝到使用者空間
    2. select
      1. poll
      2. epoll
      3. #1. epoll 並不一定比select好
        #在併發高的情況下,連線活躍度不是很高,epoll 比select 好
        #併發不高,同時連線很活躍,select 比epoll 好
  7. C10M問題
    1. 如何利用8核CPU 64G 記憶體,在10gbps 的網路上保持1000萬併發連線
  8. 什麼是協程

    1.  解決問題
      1. 回撥模式編碼複雜度高
      2. 同步程式設計的併發性不高
      3. 多執行緒程式設計需要執行緒同步,lock
    2. 方法
      1. 採用同步的方式去編寫非同步的程式碼
      2. 採用單執行緒去切換任務
        1. 執行緒是由作業系統切換 的,單執行緒以為著我們需要程式設計師自己去排程任務
        2. 不再需要鎖,併發性高,如果單執行緒內切換函式,效能遠高於執行緒切換,併發性高
  9. asyncio 非同步IO
    1. 包含各種 特定系統實現的模組化事件迴圈
    2. 輸出和協議抽象
    3. 對 tcp 、UDP、SSL、子程序,延時呼叫以及其他的具體支援
    4. 模仿futures模組但適用於事件迴圈使用的Future類
    5. 基於yield from 的協議和任務,可以讓你用順序的方式編寫併發程式碼
    6. 必須使用一個將產生阻塞IO 的呼叫時,有介面可以把這個事件轉移到執行緒池
    7. 模仿threading 模組中的同步原語、可以用在單執行緒內的協程之間
  10. q