青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2019年2月>
272829303112
3456789
10111213141516
17181920212223
242526272812
3456789


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 219730
  • 排名 - 117

最新評論

閱讀排行榜

本文為csdn I_myours 原創,此處為轉載。作者秉持了 free, open, share 的原則,但敬請各位在轉載的時候自覺標明原創作者及出處,這是各位對作者勞動成果的自覺尊重!
作者:I_myours
原文:http://blog.csdn.net/wwh578867817/article/details/49774169

首先,我們聊聊現實世界中的并發。

我曾經舉過一個并發和并行的例子:

老媽在很短的時間給我安排了很多任務,吃包子,拖地,洗碗…等等 
由于我母親大人比較嚴厲,所以我“愉快”地接受了所有任務。 
這就是所謂的并發,在某一時段,能接受的事件 
我只有兩只手,可以用一只手來吃包子,另一只手來拖地。 
這就是所謂的并行,在某一時刻,能處理的事件

現實世界中,并發的事情無處不在,就拿上面的例子來說,我答應了老媽的多個要求,老媽也收到了我的回復。這說明我們的大腦天生就是并發的,它可以在某一時段接受大量的信息。

所以,符合我們思維的并發應該如上圖,我可以接收老媽的多個消息,即使老爸回來給我發消息,我也能接收。

這是現實世界中的并發,人與人之間是單獨的個體,通過發送消息進行交流 
此時,你可能已經猜到這就是Erlang 中的并發,Actor模型的樣子。 
讓我們先跨過這個,來看看傳統的并發是如何做的。


共享內存

在我們平時寫的程序中,并發事件處理一般是通過多線程或多進程來處理。 
某一時刻,我們同時接收到了多條請求,通常的做法是將它放入隊列(共用的內存)中去,每一個線程或者進程都會去隊列中取消息進行處理。 
如下圖: 
這里寫圖片描述

此時,隊列中的內存是共享的,多個線程或進程存取會造成竟態條件,也就是產生競爭,發生錯誤。

通常的做法是 加鎖

線程或進程必須先搶到鎖,接著搶到鎖的才能訪問隊列中的消息。 
注意,鎖是錯誤的源泉 
我們應該都遇到過死鎖等錯誤,先不說性能,調試起來就很麻煩。

那么 無鎖 CAS 呢?

每個線程或進程都先取出一條消息,保存舊值,拷貝一份后修改為新值,將自己保存的舊值和原先隊列中的值比較,若相同說明沒有被其它線程或進程修改,則這條消息屬于該線程或進程,可以處理此消息。 
若舊值和新值不同,說明有其它線程或進程得到了此消息,則循環進行下一次 CAS 操作。 
這就是所謂的copy and set

這里我們不對比這兩種方式以及一會說的 Actor 模型性能的好壞。 
因為在不同的場景下,不同的方式性能也是不同的。我們需要根據具體情況,測試,分析,從而得出性能最優的方式。

順便提一句,Actor只是模型,僅僅表現給我們的是消息傳遞。至于它內部怎樣實現這里不討論,感興趣可以看看內部實現

不過從剛才的描述來看,上述方式都不符合我們的思維,而且略復雜,相信沒有人是通過 共享大腦 來傳遞及處理消息的吧?


來看看 Actor 模型

Actor 模型概念非常簡單,且非常符合我們的思維。 
萬物皆為 Actor,Actor 與 Actor 之間通過發送消息來通信。

就和人類一般,一個人是一個 Actor,人與人之間通過消息來交互。

別驚訝,Actor 模型就是這么簡單。(Actor 模型更多細節參見 Wiki Actor)

接著我們來看 Erlang 是如何運用 Actor 模型的。

Erlang 的 Actor 模型也非常簡單。 
在 Erlang 中,進程為最小的單位,也就是所謂的 Actor。注意 Erlang 的進程不是我們傳統上的進程,它運行在 Erlang 虛擬機上,非常小,非常輕,可以瞬間創建上萬,甚至幾十萬個,進程間完全是獨立的,不共享內存。在進程運行時若出現錯誤,由于進程的輕量級,Erlang 采取的措施是“讓其他進程修復”和“任其崩潰”。在 Erlang 上查看默認限制數量是26萬多,可以進行修改。每個進程創建后都會有一個獨一無二的 Pid,這些進程之間通過 Pid 來互相發送消息,進程的唯一交互方式也是消息傳遞,消息也許能被對方收到,也許不能,收到后可以處理該消息。如果想知道某個消息是否被進程收到,必須向該進程發送一個消息并等待回復。

Erlang 中的并發編程只需要如下幾個簡單的函數。

Pid = spawn(Mod,Func, Args) 
創建一個新的并發進程來執行Mod模塊中的 Fun(),Args 是參數。

Pid ! Message 
想序號為 Pid 的進程發送消息。消息發送是異步的,發送方不等待而是繼續之前的工作。

receive… end 
接受發送給某個進程的消息,匹配后處理。

receive
    Pattern 1 [when Guard1] ->
        Expression1;
    Pattern 2 [when Guard2] ->
        Expression2;
    ...
    after T ->
        ExpressionTimeout
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

某個消息到達后,會先與 Pattern 進行匹配,匹配相同后執行,若未匹配成功消息則會保存起來待以后處理,進程會開始下一輪操作,若等待超時 T,則會執行表達式 ExpressionTimeout。

舉個例子: 
現在我們要進行兩個進程的消息傳遞,一個進程發送Num1 和 Num2以及對應的操作標識,另外一個進程接受到消息后計算。 
比如 {plus, Num1, Num2} 就是求 Num1 和 Num2 的和。

-module(calculate).
-export([loop/0, start/0]).

% 創建新進程,并執行 loop 函數。
start() -> spawn(calculate, loop, []).

% loop 函數
loop() ->
    receive                     % 接受消息并進行匹配
        {plus, Num1, Num2} ->   % 匹配加法
            io:format("Num1 plus Num2 result:~p~n", [Num1 + Num2]),
            loop();
        {reduce, Num1, Num2} -> % 匹配減法
            io:format("Num1 reduce Num2 result:~p~n", [Num1 - Num2]),
            loop();
        {multi, Num1, Num2} ->  % 匹配乘法
            io:format("Num1 multi Num2 result:~p~n", [Num1 * Num2]),
            loop();
        {divis, Num1, Num2} ->  % 匹配除法
            io:format("Num1 divis Num2 result:~p~n", [Num1 div Num2]),
            loop()
    after 50000 ->              % 超時操作
              io:format("timeout!!")
    end().
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

執行結果:

這里寫圖片描述

我們一行一行來看。

第一行(標號為 1>),編譯 calculate.erl。

第二行,執行 calculate 模塊中的 start 函數并且創建進程,創建后將進程的 Pid 賦值給 Pid1。

第三行,打印 Pid1。

第四行,創建 Pid2 的進程并且向 Pid1 進程發送請求消息,計算 Num1 和 Num2 的和,Pid1 進程計算完畢后并打印。

第五行,計算減法并打印。

第六行,報錯因為 Pid3 已經被使用,在 Erlang 中變量賦值一次后就不能被改變了,不會變就不會出現多個進程修改導致不一致問題。

第七行,計算乘法并打印結果。

第八行,計算除法并打印結果。

最后,超時發生錯誤。

由此可見 Erlang 并發編程也非常簡單且符合人們的思維。

這篇文章就簡單地介紹到這里,希望有所幫助^_^。

posted on 2016-12-16 12:20 思月行云 閱讀(576) 評論(0)  編輯 收藏 引用 所屬分類: Erlang
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美一区二区色老头| 欧美日韩中文字幕| 黄色一区二区三区| 老司机aⅴ在线精品导航| 久久久精品日韩| 亚洲精品国精品久久99热一| 欧美国产精品人人做人人爱| 欧美精彩视频一区二区三区| 中国成人亚色综合网站| 一本大道久久a久久综合婷婷 | 久久综合伊人77777蜜臀| 影音欧美亚洲| 亚洲啪啪91| 欧美午夜不卡视频| 久久久久久久综合色一本| 欧美风情在线观看| 校园激情久久| 免费成人激情视频| 午夜激情综合网| 美女久久网站| 欧美一区二区三区在线| 久久嫩草精品久久久精品一| 欧美激情成人在线视频| 欧美一进一出视频| 麻豆精品视频在线观看| 一区二区三区欧美激情| 欧美一区二区免费观在线| 亚洲精品一区二区三| 欧美一级久久久| 一区二区久久久久久| 欧美在线视频a| 9国产精品视频| 久久久蜜臀国产一区二区| 在线视频欧美日韩| 久久一区中文字幕| 久久成人一区二区| 欧美四级伦理在线| 欧美激情一区二区三区在线| 国产亚洲免费的视频看| 一区二区免费在线观看| 亚洲经典在线| 久久夜色精品国产欧美乱| 亚洲欧美日韩精品久久久| 欧美成人精品高清在线播放| 久久久久久久一区| 国产精品免费在线| 99视频在线精品国自产拍免费观看 | 亚洲精品在线看| 亚洲盗摄视频| 性欧美在线看片a免费观看| 一区二区三区成人精品| 久久综合网hezyo| 免费不卡在线观看| 国产综合久久久久久鬼色| 亚洲香蕉网站| 亚洲男人的天堂在线aⅴ视频| 欧美成人一区二区三区在线观看| 久久一区视频| 禁断一区二区三区在线| 久久精品国产99国产精品| 欧美在线三级| 国产婷婷色一区二区三区在线| 亚洲午夜精品在线| 亚洲一区日韩| 国产区日韩欧美| 欧美在线观看www| 久久亚洲精品伦理| 一区二区三区在线视频观看| 久久精品主播| 欧美激情精品久久久久久蜜臀| 在线不卡a资源高清| 久久久久久久久久久成人| 久久久噜噜噜久久中文字幕色伊伊| 国产精品综合久久久| 性欧美1819性猛交| 久久婷婷国产综合尤物精品| 好吊色欧美一区二区三区视频| 久久久亚洲精品一区二区三区 | 午夜精品一区二区三区在线视| 国产精品资源在线观看| 久久国产福利国产秒拍| 欧美顶级艳妇交换群宴| 日韩图片一区| 国产精品久久网站| 久久精品人人做人人爽| 亚洲国产人成综合网站| 国产日韩高清一区二区三区在线| 欧美亚洲色图校园春色| 欧美成人免费网| 亚洲影视在线播放| 国产日产亚洲精品系列| 欧美mv日韩mv亚洲| 亚洲一区二区三区免费在线观看 | 久久免费国产精品| 亚洲精品一区二区三区不| 国产精品yjizz| 久久视频在线看| 亚洲精品四区| 美国十次了思思久久精品导航| 亚洲老司机av| 国产一区自拍视频| 欧美日韩亚洲综合| 久久久精彩视频| 在线视频中文亚洲| 免费在线一区二区| 午夜精品美女久久久久av福利| 亚洲黄色影院| 国产亚洲欧美激情| 欧美日韩视频不卡| 蜜桃久久av| 欧美在线看片| 99riav1国产精品视频| 老司机午夜精品视频| 亚洲欧美日韩一区二区三区在线观看 | 一二三区精品| 欧美激情精品久久久久| 午夜精品久久久久| 99在线|亚洲一区二区| 精品91视频| 国产欧美日韩精品在线| 欧美日韩美女| 欧美精品久久一区二区| 久久久久久久久伊人| 香蕉精品999视频一区二区| 一区二区高清视频| 亚洲精品美女在线观看播放| 免费一区视频| 久久色在线观看| 久久久精品999| 欧美一区二区三区视频在线| 亚洲欧美精品在线观看| 正在播放亚洲| 亚洲午夜精品视频| 99视频在线精品国自产拍免费观看 | 国产精品v欧美精品∨日韩| 欧美精品www在线观看| 欧美成人激情视频| 免费的成人av| 猛干欧美女孩| 欧美大胆a视频| 欧美裸体一区二区三区| 欧美成ee人免费视频| 美女黄毛**国产精品啪啪| 美女福利精品视频| 欧美激情91| 国产精品精品视频| 国产精品亚洲成人| 国产日韩亚洲欧美精品| 国产一区av在线| 国产在线不卡| 亚洲高清在线播放| 亚洲精品久久嫩草网站秘色| 亚洲免费观看| 亚洲欧美视频在线观看| 性欧美暴力猛交69hd| 久久国产精品一区二区三区四区 | 欧美午夜性色大片在线观看| 欧美三级黄美女| 国产精品久久久久久一区二区三区 | 欧美日韩欧美一区二区| 久久蜜桃资源一区二区老牛 | 久久国产精品99精品国产| 欧美一区二区三区在线免费观看| 久久国内精品视频| 久久一区二区三区国产精品| 欧美好骚综合网| 国产精品视频免费观看| 很黄很黄激情成人| 亚洲精品欧美日韩专区| 这里只有精品视频在线| 亚洲欧美日韩网| 女同一区二区| 一区二区三区久久久| 久久九九免费| 欧美体内she精视频在线观看| 国产欧美午夜| 亚洲免费高清视频| 久久久噜久噜久久综合| 日韩视频中午一区| 久久成年人视频| 欧美日韩在线观看视频| 国产一区自拍视频| 亚洲小视频在线| 你懂的视频一区二区| 国产精品99久久不卡二区| 久久精品视频在线| 国产精品大片| 亚洲乱码国产乱码精品精可以看| 欧美一级视频精品观看| 亚洲国产激情| 久久av老司机精品网站导航| 欧美视频成人| 亚洲日本欧美天堂| 久久女同互慰一区二区三区| 中日韩美女免费视频网址在线观看 | 99国产精品久久久久老师| 久久综合久久久| 国产亚洲人成网站在线观看| 99亚洲精品| 亚洲黄色一区|