#分享 Pycon TW 2019:Async contextmanager for Python 3.7
讚嘆上週公司出錢讓 data team 參加 Pycon,所以趁颱風假整理一下本次 conf 的收穫
傳送門:https://tw.pycon.org/2019/zh-hant/events/talk/867761633844265217/
共筆:https://hackmd.io/@PyConTW/2019/%2F%40pycontw%2FSkVtrjnIS
投影片:https://gamekingga.com/pycontw2019.pdf?fbclid=IwAR12CkwK-UqGVlDfUexDuED5IH18grS3L2GqrFid07TLGWGNMSbDUIhIOEI
Python 從 3.5 開始就有 async, await 的語法,但我那個時候一直沒去搞懂 async 跟 multi-thread, multi-process 有什麼差,所以就懶得學。今天就先講一下 async 這 multi 家族差在哪XD
不囉唆先上圖:
async 就是遇到 IO 的時候會跳去做別的事情,不會讓 CPU 閒下來,最好的應用就是 JavaScript,因為網頁常常要打一堆 api,這些都是 io bound 的工作,所以 JavaScript 預設就是用 async 來時間(希望我沒講錯,講錯拜託大大們糾正)。那你可能會有個疑問,我上 OS 的時候學過 multi-thread 了誒,幹嘛再學個 async 啊?好處在哪?
幫大家複習一下 multi-thread:
thread 跟 process 的差別是 thread 會共用 code, data 跟 files
但是 register, counter 跟 stack 要一人一份,這樣 cpu 跳掉要再回去的時候才知道要從哪裡開始執行(忘記的要回去複習一下組語,我說我XD)
那 async 跟 thread 的差別是他是 single thread,所以比起 multi-thread 不需要花額外的記憶體去存 register, counter 跟 stack
async 就介紹到這邊拉,下面講一下在 Python 要怎麼使用 async。
function 前面要加 async, 需要等 io 的地方請加上 await。
以下是舊版的寫法:使用 get_event_loop

3.7 之後支援 run 的語法,稍微簡潔一點

最後給電腦沒有裝 3.7 的朋友一個好物,就是用 pyenv 切換 python 的 runtime
大家就自行服用拉:https://blog.aweimeow.tw/use-pyenv-pipenv-to-archieve-clean-environment/?fbclid=IwAR1wn7zMWaECFB1fkAG2tuSH-840MT4eHcetbed2QdoLQzttJDoIdv5qnSg
Theory ref1: https://www.quora.com/What-is-the-difference-between-asynchronous-programming-and-multi-threading?fbclid=IwAR0MTefYnH_nr-Sf3700IiUVRbF-IP2Y8MTDiTqXDsBnWjBIPX2jJasKrnE
在 Async
multi-thread ref1: https://www.tutorialspoint.com/operating_system/os_multi_threading.htm?fbclid=IwAR0wgzxgbZmWHgOTIy6xKLQRxH8BqOerncmyJfVsX3f4PkueE2T6GmOOLc4
Async ref1: https://cloud.tencent.com/developer/article/1194415?fbclid=IwAR3TGa5AADLegNcmUpbMT3mBVGJ0VayZupdb2iPkUp_SzzQDREqI72h_QcE
Async ref2: https://zhuanlan.zhihu.com/p/66915932?fbclid=IwAR2bKCnLRUzEMnwFjmCwVjFbpu4L5MLgcZI4kWz9WyZKaU-bbfR3KbVsEDE

