像鳥同樣思考更好的並行編程

介紹編程

編寫一個應用程序並行運行很困難,對吧?個人意思是,它必定很難,不然咱們會看到各處的並行程序。咱們所看到的都是平滑的並行應用程序,能夠絕不費力地使用每一個可用的核心。相反,多線程應用程序是例外而不是規則。安全

編寫並行程序彷佛有兩個主要障礙:多線程

  • 學習您選擇的語言提供的並行編程結構和/或約定併發

  • 可視化您的並行程序的功能框架

第一項彷佛很明顯:休息一下,學習所選編程語言的並行功能,而後離開你 - 並行程序將從你的編譯器中跳出。除非那天下午一般會變成幾天,這一般會變成一段更長的時間,而你選擇的語言的平行特徵的含義,併發症和後果則會被馴服。異步

第二項彷佛應該提到幾乎是微不足道的。畢竟,開發一個新計劃的第一步是想象它的主要組成部分以及它們將如何運做。除了咱們一般將咱們的新程序可視化爲順序代碼組件,以便咱們稍後(若是必須的話)將某些並行的東西「栓上」。正是這種思惟框架使咱們從一開始就走上了錯誤的道路。編程語言

相反,咱們須要考慮像鳥這樣的程序。或者說,成羣的鳥兒。分佈式

背景微服務

Avian計算項目是經過改進咱們對並行編程的思考來改善並行編程的一種方式。Avian Computing鼓勵咱們將並行程序可視化爲一羣鳥,每一個鳥(線程)獨立並異步地執行操做,但它們同時做爲一羣來完成程序的目標。源碼分析

咱們都熟悉鳥類:它們被孵化出來,四處飛翔尋找食物,產卵並孵化本身的鳥類,而後死亡。Avian Computing將這些基本的鳥類行爲轉化爲開發人員能夠利用的編碼框架來快速開發工做並行程序的原型。從構建這個工做原型得到的知識深度和看法能夠簡化最終軟件產品的開發。

Avian計算的實現

併發資源管理器(ConcX)是用Java編寫的Avian Computing的概念的免費開源實現。ConcX爲用戶提供了一個能夠建立和配置新鳥的GUI屏幕。配置完成後,能夠啓動小鳥並在進度條上監控其活動。配置好的鳥羣能夠保存爲一個「羣」,能夠根據須要從新加載和運行。

像鳥同樣思考更好的並行編程

一旦孵化(開始),每隻鳥(線)遵循標準生命週期; 它尋找食物,消化找到的任何匹配的食物,儲存任何產生的食物,而後小睡一下子。在配置的耐力時限內找不到食物的鳥類將因飢餓而死亡。活得過久的鳥會死於老年。成功吃足以知足可配置設置的鳥類將複製(重複本身)。這個標準生命週期容許使用簡單天然的詞彙來處理線程管理的複雜性,這些詞彙幾乎能夠直觀地理解。

ConcX依賴於Linda協調語言來從共享虛擬關聯存儲器(稱爲元組空間)中放置和檢索對象。Linda起源於1986年,由Sudhir Ahuja,David Gelernter和Nicholas Carriero創做。Linda是幾個主要產品的基礎,包括Sun的JavaSpaces,IBM的TSpaces等等。

ConcX使用稱爲TupleTree的Linda元組空間的簡化版本。鳥類一般配置爲在TupleTree中食用和儲存食物豆莢。例如,RedPod能夠被配置爲吃RedPods的任何鳥食用,而且將被全部其餘鳥類忽略。在消化它的食物莢後,一隻鳥會將加工後的物體存放回TupleTree,一般做爲不一樣種類的食物莢(例如BluePod),以供不一樣的鳥類食用。

Linda(及其派生,TupleTree)提供了一個安全,簡單和強大的消息傳遞機制。在ConcX中,TupleTree容許在用戶編寫的代碼中沒有任何特殊的代碼或注意事項的狀況下共享對象,由於TupleTree同步(鎖定或以其餘方式提供獨佔訪問)全部與其底層數據存儲交互的方法。

使TupleTree對全部鎖定負責,確保鳥兒接收的任何食物吊艙(物體)徹底由該鳥類擁有,而不會使用鎖定和互斥等使用戶代碼混亂。這意味着任何接收到食物吊艙的鳥都是免費的在沒有來自任何其餘鳥類的爭用或干擾的狀況下對該食品盒進行任何改變。在作出任何須要的改變以後,該鳥能夠將其食物吊艙放回TupleTree,在那裏不一樣種類的鳥會吃它並進行改變。

平行思惟的簡單範例

ConcX提供的Addx場景是Avian計算概念如何生成更簡單的並行代碼的直接示例。Addx場景的目標是經過對每一個值執行一系列數學運算來處理一系列值,直到計算出最終值並保存爲止。數學運算必須始終以相同的順序執行。

在標準的順序編碼中,咱們將經過獲取下一個值,執行第一個數學運算,而後第二個數學運算,而後第三個數學運算等開始可視化一個循環,直到計算出最終值爲止,該值爲保存,而後循環重複。看起來相對簡單,而且運行速度儘量快。其最大吞吐量取決於執行單線程的一個處理器的速度。

爲了更快速地處理更多的值,須要使用多個處理器,這就是棘手的問題。正常的解決方案是建立一個線程池,每一個線程執行上述的順序代碼。可是這會使處理複雜化,由於並行代碼必須 確保輸入值僅由一個線程處理,而且不會跳過輸入值,同時確保不會發生死鎖和活鎖。很難想象線程可能會互相干擾的全部可能的方式 - 在客戶的站點上展現了屢次新的使人驚訝的失敗模式。更不用說必須爲每一個運行時環境(筆記本電腦vs大型機等)預先配置和編譯多個版本的應用程序。

Addx(Avian)解決方案配置了一個任意數量的鳥羣,每隻鳥只吃一種食物,而且在將其做爲不一樣類型的食物放回以前,只對該食物執行一次數學運算。經過適當配置食物和儲存的食物,保證數學操做的正確順序。例如,Bird1吃Food1,對其執行數學運算,並將其存儲爲Food2。Bird2吃Food2,對它進行數學運算,並將其做爲Food3存儲。Bird3吃Food3,等等。這也能夠更簡潔地表達爲:

食物1 - > Bird1 - > FOOD2 - > BIRD2 - > Food3 - > Bird3。。。.Foodn - > Birdn。

如下簡化圖說明了Avian並行性。

  • 在下面的生命週期1中,全部五隻鳥在大約同一時間開始飛行,但只有Add1Bird找到任何食物。它對該值執行操做,而後將其做爲只有Add2Bird吃的食物放回到TupleTree中。

  • 在生命週期2中,Add1Bird和Add2Bird均可以找到食物,以便他們都執行各自的操做,而後將其食物存儲回TupleTree。

  • 在生命週期3中,Add1Bird,Add2Bird和Add3Bird均可以找到它們的食物種類,處理它們並將它們放回到TupleTree中。

像鳥同樣思考更好的並行編程

大約第五個循環經過它們的生命週期(找到食物,消化它,儲存它和午睡),全部五隻鳥同時從TupleTree進食,處理它們的莢,並將它們更新的莢儲存在樹中。上面只畫了5只鳥,但很容易想象將這個圖放大到包括20只或50只或100只鳥,它們都將同時運行(飛行),全部這些都遵循相同的簡單和天然的模式。就像真正的鳥類同樣,若是任何鳥類尋找食物而且沒有找到它,它就會等待一下子,而後再次嘗試。

重要提示:如圖所示這鳥不步調一致操做的簡化圖。每隻小鳥以其本身的個體速率生活,由於每次小睡時,它會隨機選擇一段時間(在可配置的範圍內)。這意味着隨機短期小睡的小鳥會比隨機長時間小睡的小鳥更快地完成其生命週期。隨着時間的推移,午睡的時間長短會趨於平緩,因此一段時間之後會很慢。在現實生活中,Add5Bird(或任何其餘鳥)開始吃以前可能須要3或10或15個週期。

配置鳥類

ConcX提供GUI屏幕來添加,配置和啓動鳥類。GUI屏幕還能夠在鳥兒飛行時提供動態的實時狀態更新。如下屏幕截圖顯示了運行Addx場景的五隻小鳥。屏幕右側的進度條實時顯示每隻鳥的成功。每隻鳥的進度條越長,鳥成功吃的次數就越多。

像鳥同樣思考更好的並行編程

因爲每隻鳥都有用戶可選擇的食物類型,所以從新排列數學運算的順序很簡單。只需更改選定的食物並從新運行便可。若是任何鳥的配置不合適,它將沒法找到食物,其進度條也不會增加。

「食物供應」選項卡包含食物容器進度條,能夠實時動態顯示可用食物容器的數量。當運行結束時,TupleTree選項卡顯示其包含的食物莢的時間戳列表以及每一個食物莢內容的簡要摘要以及每一個食物莢和哪些鳥執行的交易。

上述功能都集成到併發資源管理器中,容許您交互式地探索和開發並行程序。一旦你瞭解瞭如何將程序分解爲能夠並行運行的子步驟,則可使用所選擇的編程語言對應用程序進行編碼。

使用代碼

下面顯示了Add3Bird的完整Java代碼。它只有43行,幾乎一半(19)的行能夠是註釋或空白(用於視覺分離的空白或單個花括號)。Add3Bird所需的惟一代碼是afterDigestion方法的重寫,它所作的只是將3添加到它找到的任何非空食品盒中。查找窗體並將其存儲回樹中都由BasicBird框架處理,使開發人員的工做變得更輕鬆。

像鳥同樣思考更好的並行編程

對於上面的代碼最重要的是,在這段代碼中沒有鎖定或同步或互斥,由於它所有由TupleTree和ConcX框架處理。全部的多線程並行代碼都在後臺進行管理,所以用戶能夠專一於如何將主要任務劃分爲鳥類能夠並行處理原子的小尺寸碎片。

雖然上述任務可能看起來過於簡單,但它實際上只是更復雜場景的模板。例如,若是Add1Bird被一隻抓住10毫秒聲音的鳥取代而且Add2Bird被替換爲對其執行快速傅里葉變換的鳥而且Add3Bird被替換爲試圖將所得輸出與其餘先前處理的結果等。若是第二隻鳥跟不上第一隻鳥,而不是試圖修改它以加快運行速度(而且可能引入錯誤),那麼首選的Avian解決方案就是添加另外一個實例(或另外10個實例)第二隻鳥。

興趣點

Avian Computing的開發旨在鼓勵用戶基於天平生行的模型(例如鳥羣)來形象化他們的並行程序。蜜蜂蜂羣,魚羣或馬羣也能夠做爲模型,由於它們都包含多個獨立運行而且異步運行的角色,同時也能夠一塊兒工做。

ConcX是由開發人員/實驗者共同建立的。這是一個交互式環境,容許用戶啓動和中止鳥類的各類組合和配置。雖然每隻鳥的飛行都有一個不斷更新的進度條,以顯示它的成功程度和可用的食物供應量。飛行結束後,能夠檢查雞羣的結果以及每隻雞的事件歷史記錄。

Avian Computing和ConcX實現的概念旨在成爲培訓輪子,幫助咱們的單線程思惟思考並討論並行程序。

要詳細瞭解Avian Computing的基本概念以及爲何咱們須要幫助來思考並行程序,請訪問Avian Computing網站。若是您準備嘗試一下,能夠從Avian網站或SourceForge下載ConcX-2.x.zip(jar文件,lib文件和flock文件)。請務必同時下載「Avian Computing入門指南」用戶指南,由於它包含安裝信息以及大約十幾種並行方案,例如並行計算Pi,用餐哲學家Probelm,BarberShop場景等。

針對上面的技術我特地整理了一下,有不少技術不是靠幾句話能講清楚,因此乾脆找朋友錄製了一些視 頻,不少問題其實答案很簡單,可是背後的思考和邏輯不簡單,要作到知其然還要知其因此然。若是想 學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠 加個人Java進階羣:744642380,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分 享給你們

相關文章
相關標籤/搜索