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

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 組的大佬說本身的使用場景

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

相關文章
相關標籤/搜索