Python開源非同步併發框架

weixin_34162629發表於2015-08-07
Python開源非同步併發框架的未來

    2014年3月30日,由全球最大的中文IT社群CSDN主辦的“開源技術大會·2014” (Open Source Technology Conference 2014,簡稱OSTC 2014)在北京麗亭華苑酒店召開。

    本次大會以“啟蒙·開源”(Open Mind, Open Source)為主題,邀請到了來自全國各地的30多位開源業界資深人士發表主題演講,數十個開源社群現場參與,到場的開源軟體開發者、貢獻者和開源愛好 者總人數超過500人。作為一場“接地氣”的開源盛會,“OSTC 2014”以其開放性、專業性、社交性深受與會者的好評。

    王川:我叫王川,英文名叫Fantix,我的工作主要用Python做創業,業餘的時候也會研究不同開源專案,今天主要和Python有關 系,Python3.4兩週前釋出新的版本,就有今天講的新的庫,相信大家對Python有所瞭解,或者比較熟悉,簡單的來說Python就是解釋型的, 更像指令碼語言,先從兩個比較容易混淆的概念開始說起,不知道大家有沒有去辦護照的經歷,我前一段時間辦一個港澳通行證,上午10點去的,下午2點半才辦 完,下午飯都沒有吃上,真不是辦事效率低,人實在是太多了,從視窗一直排到門口,辦的這個證這麼慢,大家肯定不樂意,領導想了一個轍,多開一個視窗,開 10個視窗,通口量一下就上去了,這個照片非常的寫實,和我照片現場一點都不差,雖然這個照片是春運時候拍的。並行的概念就出來了,並行是關於多個處理 器,多個視窗一起辦理通行證的業務,要說這只是排一個隊,花4個半小時,現場我排了三個隊,先排隊取號,然後排隊照相,照相之後才能辦理通行證,每一個隊 上都是人在排隊,併發的概念也就出來了,大廳裡最能站多少人,能站800人,這個併發量就是800。

    並行更多是關注與視窗或者說處理端,必須有一個處理器,它的概念就是要多個處理器,同時在處理不同的事情,和相對的併發不關心處理的一方, 更關注是使用者,我們有大量的使用者同時在訪問一個黑箱的伺服器,同時能訪問的數量就是併發的數量,併發並不關心伺服器裡到底有(EK)CPU,還是有 look CPU,如果有一個問題了,如果只有一個CPU併發怎麼能實現?有一個常規的做法就是把併發交給作業系統,用作業系統的多程式或者多執行緒來實現併發,多進 程在這裡先不討論了,因為Python有一些IL多執行緒其實也並不理想,所以還需要有一個新的方案。

    比較常規的一個辦法用作業系統提供的這幾個介面,經常被用到,用來做併發,通過這幾個介面很容易的操作多個IL的計量,來實現試點驅動併發 程式設計,什麼樣的試點驅動呢?現在有一個現象需要同時服務10萬客戶端,把10萬個連線先建立上,通過這樣的迴圈來實現併發,select從10萬客戶端裡 這裡選出來最先有資料的客戶端,然後做下面的事情,下面的reciv就可以非組塞的方式來實現,就可以非常快速的來完成處理過程,如果select謊報軍 情給一個錯誤的資訊,什麼也不做,繼續迴圈,這個迴圈一旦跑起來這個併發就實現了。

    這樣的程式碼簡單的寫例子還可以,如果寫大的外部的應用還是挺費事的,所以要用到框架,Python裡關於非同步併發框架應用很多,比如 tornado這是facebook的開源的非同步框架,把sock給tornado IL LOOK,或者是主迴圈就可以實現socket,比如有新的連線,新的資料,有時間時候呼叫這個回撥的函式,這個回撥函式是非同步寫的方式,但是寫多了也有 一定的難度,其他的庫還有對底層的封裝,比如一個老牌的酷是twisted,做的分裝用是protocol和transbo(音),protocol對應 用層的協議做重灌,transbo(音)對底下的傳輸做封裝,在需要有資料的時候呼叫(trsbook rit)就可以把這個資料發出去,把有一個著名的deferred,實現資料來源和函式的分離,defebrred是比較著名的一個部分,用它寫的程式碼和 copak,寫小的可以,寫大了很難找清楚一個程式前後的順序,所以拋開deferred,用一個新的技術,在(英文) ,比如callbocks,用就可以直接在同一個函式裡拿到這個客戶端,下面的程式有4到5個回撥函式,寫在同一個函式裡類似同步的,實是非同步的寫的方 式,方便程式設計師寫的維護,顯示的非同步切換,相對於相識追求極致程式設計師,提出引入的轉換,evntlet,gevent,可以把地層的程式碼打上補貼,如果調 用常規的程式碼像oropen,如果有一些現有的程式碼,是同步的,比如jangl如果一部併發的來實現的話是為數不多的選擇之一。

    對於顯示和隱式的一部切換各有爭議,隱式的藏得更深。

    對於Python3的支援對於tornado實現,gevent我來做,最後一批已經發給作者了。

    從統計資料上來看gevent並不是很活躍。

    互操作性,今天大部分的框架都實現了對twisted的支援,時間比較長,大家都會有遺留程式碼,成為事實上的標準,但是對於不同的框架的第 三方類庫的支援,這幾個框架都是各成一派,每個人的介面都會有一套自己的實現,像twisted或者mysql,將來會變成什麼樣?

    Python作者,寫了一個庫是全新寫的一部程式設計的庫,Python的作者和twisted作者聊得太多了,其實這個庫挺像twisted,比如collback和import是一樣的,新增兩秒之後的回撥,程式在沒兩秒鐘輸出一個(lawork)。

    protocol transport收到訊息的時候發回去。

    future概念用來對回撥函式進行封裝,這個是存在於tes庫裡的介面。

    asyncio,from可以串接在一起,corouitine對於非同步函式做的修飾器,微執行緒,攜程,輸出hello world,被修飾的corouitine。

    最下面有一個task和future有一個結果,扔給主迴圈,達到這樣的結果。

    asyncio 更多是一個規範,隨著3.4釋出的是參考實現,也就是這個藍色的框,以及原廠的發動機,這個是自己的event loop,寫自己的應用程式,asyncio更充分考慮互操作性,可以把原廠的換掉,換上自己的,或者在asyncio,asyncio有兩種發動機,通 過用不同的介面卡,適配不同的程式碼,有twisted程式碼,有gevent程式碼。

    另外用組裝的發動機,用asyncio基本框架,使用已有庫的核心,比如說用twisted event lopp,可以直接實現程式碼是底層是一樣的。將來的互操作性,和對已有的適配意義不太大了,因為asyncio每個框架只要實現自己的適配適配到標準的上 面,所有的程式碼都可以通過這個網路實現一定的互操作性,這個在程式裡是很美好的,希望能實現,現在這個實現的過程已經在做了,像twisted和 tomado已經在實現了做了,我自己在做gevnt的適配,就是這樣謝謝大家!

 

相關文章