理解 python 的 async:
1. 協程后面的技術也是 IO 多路復用, Nginx 和 nodejs 都充分利用了這種機制.
2. Flask 線程中為什么不能直接使用標准庫 asyncio 來支持異步?
asyncio 一定要有應該eventloop, 而這個 eventloop 必須運行在主線程, 不能運行在子線程中, 所以在Flask 線程中不能直接使用標准庫 asyncio.
3. 如果在單並發的情況下, web響應很慢. 改成 async模式, 並不會改善"單次"請求響應速度. 當然改成 async 通常來講還是有意義的, 因為小並發時候響應很差, 當並發量稍微增加時, 在同步模式下, 響應就會急劇變差, 甚至無法響應. async 模式下, 從小並發到大並發, 響應速度下降非常緩慢.
如何將Python的同步方法改寫異步? Python的異步方法大概可分三類:
1. 專門的基於 asyncio 優化的單線程異步方法
優點: 這類方法使用簡單, 就像同步方法調用一樣, 並發性能很高, 即使是在大並發下, latency也不會變差.
缺點: 基於 asyncio 的類庫比較少, 最有名的是 aiohttp 庫, https://github.com/aio-libs 還有一些.
實現一個這樣的方法, 有些難度, 可以參考 aio-libs 下的一些類庫.
2. 基於多線程(多進程)的 awaitable 方法
優點: 這類方法使用簡單, 就像同步方法調用一樣. 另外, 編寫這類方法也非常簡單, 先先一個同步方法, 然后利用一個 wrapper 就能轉成異步方法.
缺點: 性能較差, 主要是因為沒有做過細節優化, 只有方法整體運行完畢后, 才會將控制權交出, 管控粒度太粗, 通過多線程來支持並發.
3. 傳統的多線程(多進程)的后台任務
優點: 如果不需要加上回調功能, 使用這種方法非常簡單, 代碼也容易維護, 並發性能也很好.
缺點: 要及時獲取這種后台任務的結果, 只能使用回調函數, 代碼就變得難以維護.
說明:多線程(多進程)推薦使用 cocurrent.futures.ThreadPoolExecutor 和 cocurrent.futures.ProcessPoolExecutor 兩個池.
理解Python Async
https://www.aeracode.org/2018/02/19/python-async-simplified/
https://stackabuse.com/overview-of-async-io-in-python-3-7/
https://pymotw.com/3/asyncio/index.html
https://www.blog.pythonlibrary.org/2016/07/26/python-3-an-intro-to-asyncio/
https://tryexceptpass.org/article/asyncio-in-37/
https://tryexceptpass.org/article/controlling-python-async-creep/
https://tryexceptpass.org/article/threaded-asynchronous-magic-and-how-to-wield-it/
基於 asyncio 的 Aiohttp web 框架, 比如適合作 restful api 服務
Aiohttp 和 Flask 的對比
https://stackabuse.com/asynchronous-python-for-web-development/
https://stackabuse.com/asynchronous-vs-synchronous-python-performance-analysis/
python中重要的模塊--asyncio
https://www.cnblogs.com/zhaof/p/8490045.html
https://www.syncd.cn/article/asyncio_article_01
https://www.syncd.cn/article/asyncio_article_02
https://www.syncd.cn/article/asyncio_article_03
可以為 awaitable 的 Task 增加回調:
task.add_done_callback(got_result) # task完成的時候通知我們
Django 社區推動的 ASGI 規范和實現
ASGI 服務器和框架
https://asgi.readthedocs.io/en/latest/implementations.html
Sanic -類 flask 的異步web framework
Python黑魔法 --- 異步IO( asyncio) 協程
https://www.jianshu.com/p/b5e347b3a17c
asyncio 中的 future 其實和 cocurrent.futures 中的future 不是一回事,
https://stackoverflow.com/questions/49350346/how-to-wrap-custom-future-to-use-with-asyncio-in-python