PyCon 2018 的視頻才上傳不久,我也纔剛剛補。而後視頻我在聯繫 PSF 看能不要受權搬回國內方便觀看。html
首先我只補了兩個視頻,python
John Reese - Thinking Outside the GIL with AsyncIO and Multiprocessinggit
Andrew Godwin - Taking Django Asyncgithub
一個是,Facebook 來的大佬講的 async/await 在 Facebook 組的應用,最後順便賣了一個廣告。併發
另一個是 Django 組的大佬也來說,關於 async/await ,同時推廣 ASGI ,又是另一個話題了。async
我今晚先講講 Facebook 的視頻,第二個視頻我再補= =ide
首先 Facebook 這個視頻很短,可是我以爲意義蠻重要的,函數
第一,全程沒有秀什麼特殊技巧,很適合初學者來到 Python 3 的世界性能
第二,並不單單是講了 async 這樣一種針對 I/O 密集型的手段,也傳授了一些 multiprocessing 使用中的技巧優化
第三,出來站臺,你看大廠在用,咱們也能夠用試試?
好了,回到正題
首先 Facebook 組的大佬說本身的使用場景
其中最主要的是,須要從不少個接口中請求數據,而且將其整合起來。
最開始,他們在 Python 2 下使用線程池來完成這樣的 I/O 操做,而後發現,兄弟這不對勁啊QAQ
內存佔用大,同時仍是被 GIL 限制着。而後他們開始將代碼升級到 Python 3,(這裏畫外音一下,Python 3.2 時將 GIL 進行過一次改造,讓 thread 表現更好,參見 What’s New In Python 3.2) 好了,升級後發現
性能提高良好啊= =,因此天滅 Python 2 。
好了,目前還有一個大問題,GIL 怎麼辦。
Facebook 給出了兩種選擇
第一種,Multiprocessing
而後給出了一個使用小技巧
第二種,asyncio
說了 asyncio 的三個特性,
第一個,是 Future 模式的一種使用(Future 模式是在 Python 3.2 引入,PEP 3148 提出,參見 PEP 3148 -- futures - execute computations asynchronously)
第二個,asyncio 比線程快
第三個,I/O 併發
而後給展現了一個 asyncio 的最基本的用法
而後後面 Facebook 大佬花了一段時間講了下怎麼將 multiprocessing 和 asyncio 結合,這裏我先不劇透,你們能夠去瞧瞧
不過其中有一個點比較吸引我
你們猜猜這裏面亮點在哪?
嗯,前面函數定義的時候用了新的特性 type annotation,最先於 PEP 484 Type Hints提出,3.5 引入,後續有幾個提案都在圍繞這個作優化,好比 3.6 的 PEP 526,3.7 的 PEP 563 不過這個說來話長,改天有時間寫個辣雞水文聊一聊吧。
不過 type-annotation 是個趨勢,使用以後,配合 IDE ,提示,檢查的體驗都會提高一個臺階。
最後 Facebook 的大佬瀟灑的扔了一個圖,
而後扔了一個庫
jreese/aiomultiprocess 圖標 本次視頻到此結束,
好了再說說個人感想
首先咱們公司用 async/await 這一套用的很廣,不少。在進一年的過程之中發現官方的 asyncio 這一套有不少潛在的坑,可是其對性能的提高實在美好。因此我將其成爲甜美的毒藥。不過雖然我已經將 asyncio/Sanic/aiohttp 這一套 async/await 的當前頂樑柱黑出翔了,可是平心而論,async/await 這套意義和做用重大,很是棒的特性。同時社區的周邊也逐漸起來,好比python-trio/trio了,同時愈來愈多的大公司開始使用,踩坑。雖不敢說 async/await 前景光明,可是隨着後續的發展,將會成爲人們在處理 I/O 密集型應用時優先的一個選擇倒也不是什麼難事兒。
因此先這樣吧。
另外 Django 哪一個視頻,你們在去看以前,建議先去看一個由 Django 開發組提出的,目前還處於 Draft 的做爲現行 PEP3333PEP 3333 -- Python Web Server Gateway Interface v1.0.1 WSGI 替代的 ASGI 的相關提案詳情,參見 ASGI - Channels 2.1.1 documentation