PyCon 2018 閒聊系列:Facebook async 使用總結

Zheaoli發表於2018-05-15

PyCon 2018 的視訊才上傳不久,我也才剛剛補。然後視訊我在聯絡 PSF 看能不要授權搬回國內方便觀看。

首先我只補了兩個視訊,

John Reese - Thinking Outside the GIL with AsyncIO and Multiprocessing

Andrew Godwin - Taking Django Async

一個是,Facebook 來的大佬講的 async/await 在 Facebook 組的應用,最後順便賣了一個廣告。

另外一個是 Django 組的大佬也來講,關於 async/await ,同時推廣 ASGI ,又是另外一個話題了。

我今晚先講講 Facebook 的視訊,第二個視訊我再補= =

首先 Facebook 這個視訊很短,但是我覺得意義蠻重要的,

第一,全程沒有秀什麼特殊技巧,很適合初學者來到 Python 3 的世界

第二,並不僅僅是講了 async 這樣一種針對 I/O 密集型的手段,也傳授了一些 multiprocessing 使用中的技巧

第三,出來站臺,你看大廠在用,我們也可以用試試?

好了,回到正題

首先 Facebook 組的大佬說自己的使用場景

image

其中最主要的是,需要從很多個介面中請求資料,並且將其整合起來。

最開始,他們在 Python 2 下使用執行緒池來完成這樣的 I/O 操作,然後發現,兄弟這不對勁啊QAQ

image

記憶體佔用大,同時還是被 GIL 限制著。然後他們開始將程式碼升級到 Python 3,(這裡畫外音一下,Python 3.2 時將 GIL 進行過一次改造,讓 thread 表現更好,參見 What’s New In Python 3.2) 好了,升級後發現

image

效能提升良好啊= =,所以天滅 Python 2 。

好了,目前還有一個大問題,GIL 怎麼辦。

Facebook 給出了兩種選擇

第一種,Multiprocessing

image

然後給出了一個使用小技巧

image

第二種,asyncio

image

說了 asyncio 的三個特性,

第一個,是 Future 模式的一種使用(Future 模式是在 Python 3.2 引入,PEP 3148 提出,參見 PEP 3148 -- futures - execute computations asynchronously)

第二個,asyncio 比執行緒快

第三個,I/O 併發

然後給展示了一個 asyncio 的最基本的用法

image

然後後面 Facebook 大佬花了一段時間講了下怎麼將 multiprocessing 和 asyncio 結合,這裡我先不劇透,大家可以去瞧瞧

不過其中有一個點比較吸引我

image

大家猜猜這裡面亮點在哪?

嗯,前面函式定義的時候用了新的特性 type annotation,最早於 PEP 484 Type Hints提出,3.5 引入,後續有幾個提案都在圍繞這個做優化,比如 3.6 的 PEP 526,3.7 的 PEP 563 不過這個說來話長,改天有時間寫個辣雞水文聊一聊吧。

不過 type-annotation 是個趨勢,使用之後,配合 IDE ,提示,檢查的體驗都會提升一個臺階。

最後 Facebook 的大佬瀟灑的扔了一個圖,

image

然後扔了一個庫

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

相關文章