Python-02進階-04多進程多線程

Python 進階-04 進程線程協程併發等.md

tags: Python 多進程 併發 進階 必備知識 2019 年

本節主要描述:

1. Python進程線程協程併發等術語
2. 以及如何高效利用Python編寫高性能程序.

術語

協程

“協程是一種用戶級的輕量級線程”,應用場景多用於 IO 密集型, 他有高併發的特點, 不適用於 CPU 密集型的場景。

協程主要是利用迭代器來實現多線程的效果,

相對於多線程的優勢在於:

  1. 減少系統調用(切換線程需要系統級調用)的開銷,
  2. 多協程運行於單線程中, 所以內存安全的, 不會產生髒數據, 也不會去競爭 GIL.
  3. 然後多進程+多協程可以達到充分利用 cpu 的效果

協程的關鍵在於
yield 迭代器(generator)
send, yield 是把迭代器裏的值返回出來, send 就是把值寫進迭代器,
yield from, “yield from iterable 本質上等於 for item in iterable: yield item 的縮寫版”, yield from 的出現是爲了解決 嵌套的迭代器問題
asyncio, 一個基於事件循環的異步 I/O 模塊, 類似的有 gevent, tornado 等, 在 asyncio 中, yield from 就發揮了很大的作用, 因爲有大量的消息需要隔層傳遞. 在 asyncio 中, 主要這樣幾個概念, 首先有一個 event_loop 事件循環, 它是一個無限循環程序

https://www.jianshu.com/p/90ada937c90d

asyncio 主要流程應該是: 定義協程函數, 如果有耗時的操作用 await 掛起 —> 創建一個事件循環 ----> 創建 task ----> 綁定回調 —> 註冊 task —> 從 task 的 result 獲取結果.
搭配進程可以開多條 事件循環, 多核的並行操作.
搭配線程還可以動態的註冊 task.
搭配 aiohttp 進行異步的 http 請求.

並行:多個 CPU 核心,不同的程序就分配給不同的 CPU 來運行。可以讓多個程序同時執行
併發:單個 CPU 核心,在一個時間切片裏一次只能運行一個程序,如果需要運行多個程序,則串行執行

批處理:指一個處理完了另一個再處理;

進程:即每個程序的執行的代碼(全部流程),加上執行現場(當前執行場景);

併發:因爲多個程序在一個 CPU 上不斷切換,人類看起來如同程序在同時執行,這就是併發;
並行:即多個程序同時在多個 CPU 上執行,就是並行;

線程:進程內部,有多個執行流程(加上每個流程的執行場景),這個流程就是線程;

協程:即線程內部,轉換運行控制權;

進程是:一個 CPU 情況下,多個程序分別使用機器資源(CPU 或硬盤等)的概念;
線程是:一個進程情況下,多個執行流程(即線程)分別使用分配給該進程的機器資源的概念;
協程是:一個線程情況下,多個執行流程(即協程)由線程控制,分別使用分配給該線程的機器資源的概念;

進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源;
線程是處理器調度的基本單位;
協程可以理解爲線程內部調度的基本單位。
協程的優勢在於:處理器調度(即線程)會有很大的場景切換消耗,而對處理器來說,協程屬於同一個調度,切換消耗較小。
本質就是各種抽象,用於提升小路,不用糾結太深,只要可以更好的解決問題提升效率即可。

附件

參考鏈接

Python 之路[9] - 進程、線程、攜程篇

發佈了88 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章