tags: python 多程序 併發 高階 必備知識 2019 年
本節主要描述:
1. python程序執行緒協程併發等術語
2. 以及如何高效利用python編寫高效能程式.
「協程是一種使用者級的輕量級執行緒」,應用場景多用於 io 密集型, 他有高併發的特點, 不適用於 cpu 密集型的場景。
協程主要是利用迭代器來實現多執行緒的效果,
相對於多執行緒的優勢在於:
減少系統呼叫(切換執行緒需要系統級呼叫)的開銷,
多協程執行於單執行緒中, 所以記憶體安全的, 不會產生髒資料, 也不會去競爭 gil.
然後多程序+多協程可以達到充分利用 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 事件迴圈, 它是乙個無限迴圈程式
asyncio 主要流程應該是: 定義協程函式, 如果有耗時的操作用 await 掛起 —> 建立乙個事件迴圈 ----> 建立 task ----> 繫結** —> 註冊 task —> 從 task 的 result 獲取結果.
搭配程序可以開多條 事件迴圈, 多核的並行操作.
搭配執行緒還可以動態的註冊 task.
搭配 aiohttp 進行非同步的 http 請求.
並行:多個 cpu 核心,不同的程式就分配給不同的 cpu 來執行。可以讓多個程式同時執行
併發:單個 cpu 核心,在乙個時間切片裡一次只能執行乙個程式,如果需要執行多個程式,則序列執行
批處理:指乙個處理完了另乙個再處理;
程序:即每個程式的執行的**(全部流程),加上執行現場(當前執行場景);
併發:因為多個程式在乙個 cpu 上不斷切換,人類看起來如同程式在同時執行,這就是併發;
並行:即多個程式同時在多個 cpu 上執行,就是並行;
執行緒:程序內部,有多個執行流程(加上每個流程的執行場景),這個流程就是執行緒;
協程:即執行緒內部,轉換執行控制權;
程序是:乙個 cpu 情況下,多個程式分別使用機器資源(cpu 或硬碟等)的概念;
執行緒是:乙個程序情況下,多個執行流程(即執行緒)分別使用分配給該程序的機器資源的概念;
協程是:乙個執行緒情況下,多個執行流程(即協程)由執行緒控制,分別使用分配給該執行緒的機器資源的概念;
程序是資源分配和擁有的單位,同乙個程序內的執行緒共享程序的資源;
執行緒是處理器排程的基本單位;
協程可以理解為執行緒內部排程的基本單位。
協程的優勢在於:處理器排程(即執行緒)會有很大的場景切換消耗,而對處理器來說,協程屬於同乙個排程,切換消耗較小。
本質就是各種抽象,用於提公升小路,不用糾結太深,只要可以更好的解決問題提公升效率即可。
python 之路[9] - 程序、執行緒、攜程篇
Python高階 多程序
在 python高階教程m10 多執行緒 和 python高階教程m10b 多執行緒通訊 我們介紹了多執行緒程式設計,並行程式設計模式中還有一種多程序程式設計模式,這篇文章將介紹到多程序程式設計。多程序需要用到multiprocessing模組,多程序程式設計模型可以參考多執行緒模型。通過乙個例子我...
python 多程序 高階 程序池
如果需要啟動大量的子程序,使用程序池批量建立子程序的方式更加常見,因為當被操作對物件數目不大時,可以直接利用multiprocessing中的process動態生成多個程序,如果數量大,此時就應該使用pool。pool 可以提供指定數量的程序供使用者呼叫,預設大小是cpu的核數。當有新的請求提交到p...
python 多程序 04 協程
協程是程式設計師創造出來的 單純的協程沒有作用 需要io操作時候進行切換 才有意義 原理 greenlet import greenlet def f1 print 11 gr2.switch print 33 gr2.switch def f2 print 22 gr1.switch print ...