• <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>
            教父的告白
            一切都是紙老虎
            posts - 82,  comments - 7,  trackbacks - 0
                所謂分布式的Erlang應(yīng)用是運(yùn)行在一系列Erlang節(jié)點(diǎn)組成的網(wǎng)絡(luò)之上。這樣的系統(tǒng)的性質(zhì)與單一節(jié)點(diǎn)上的Erlang系統(tǒng)并沒(méi)有什么不同。分布式這是個(gè)“大詞”,Erlang從語(yǔ)言原生角度支持分布式編程,相比于java簡(jiǎn)單不少。
            一、分布式機(jī)制
            下列的BIFs是用于分布式編程:
            spawn(Node, Mod, Func, Args)
            啟動(dòng)遠(yuǎn)程節(jié)點(diǎn)的一個(gè)進(jìn)程

            spawn_link(Node, Mod, Func, Args)
            啟動(dòng)遠(yuǎn)程節(jié)點(diǎn)的一個(gè)進(jìn)程并創(chuàng)建連接到該進(jìn)程

            monitor_node(Node, Flag)
            如果Flag是true,這個(gè)函數(shù)將使調(diào)用(該函數(shù))的進(jìn)程可以監(jiān)控節(jié)點(diǎn)Node。如果節(jié)點(diǎn)已經(jīng)舍棄或者并不存在,調(diào)用的進(jìn)程將收到一個(gè){nodedown,Node}的消息。如果Flag是false,監(jiān)控將被關(guān)閉

            node()
            返回我們自己的進(jìn)程name

            nodes()
            返回其他已知的節(jié)點(diǎn)name列表

            node(Item)
            返回原來(lái)Item的節(jié)點(diǎn)名稱,Item可以是Pid,引用(reference)或者端口(port)

            disconnect_node(Nodename)
            從節(jié)點(diǎn)Nodename斷開(kāi)。

                節(jié)點(diǎn)是分布式Erlang的核心概念。在一個(gè)分布式Erlang應(yīng)用中,術(shù)語(yǔ)(term)節(jié)點(diǎn)(node)意味著一個(gè)可以加入分布式 transactions的運(yùn)行系統(tǒng)。通過(guò)一個(gè)稱為net kernal的特殊進(jìn)程,一個(gè)獨(dú)立的Erlang系統(tǒng)可以成為一個(gè)分布式Erlang系統(tǒng)的一部分。當(dāng)net kernal進(jìn)程啟動(dòng)的時(shí)候,我們稱系統(tǒng)是alive的。

                與遠(yuǎn)程節(jié)點(diǎn)上的進(jìn)程進(jìn)行通信,與同一節(jié)點(diǎn)內(nèi)的進(jìn)程通信只有一點(diǎn)不同:
            java 代碼
            1. {Name, Node} ! Mess.  
              
            顯然,需要接收方增加一個(gè)參數(shù)Node用于指定接受進(jìn)程所在的節(jié)點(diǎn)。節(jié)點(diǎn)的name一般是用@隔開(kāi)的atom類型,比如pong@dennis,表示計(jì)算機(jī)名為dennis上的pong節(jié)點(diǎn)。通過(guò)執(zhí)行:
            java 代碼
            1. erl -sname pong  

            將在執(zhí)行的計(jì)算機(jī)中創(chuàng)建一個(gè)節(jié)點(diǎn)pong。為了運(yùn)行下面的例子,你可能需要兩臺(tái)計(jì)算機(jī),如果只有一臺(tái),只要同時(shí)開(kāi)兩個(gè)Erlang系統(tǒng)并以不同的節(jié)點(diǎn)名稱運(yùn)行也可以。

            二、一些例子。
                這個(gè)例子完全來(lái)自上面提到的翻譯的連接,關(guān)于分布式編程的章節(jié)。我增加了截圖和說(shuō)明。
            首先是代碼:
            java 代碼
             
            1. -module(tut17).  
            2.   
            3. -export([start_ping/1, start_pong/0,  ping/2, pong/0]).  
            4.   
            5. ping(0, Pong_Node) ->  
            6.     {pong, Pong_Node} ! finished,  
            7.     io:format("ping finished~n", []);  
            8.   
            9. ping(N, Pong_Node) ->  
            10.     {pong, Pong_Node} ! {ping, self()},  
            11.     receive  
            12.         pong ->  
            13.             io:format("Ping received pong~n", [])  
            14.     end,  
            15.     ping(N - 1, Pong_Node).  
            16.   
            17. pong() ->  
            18.     receive  
            19.         finished ->  
            20.             io:format("Pong finished~n", []);  
            21.         {ping, Ping_PID} ->  
            22.             io:format("Pong received ping~n", []),  
            23.             Ping_PID ! pong,  
            24.             pong()  
            25.     end.  
            26.   
            27. start_pong() ->  
            28.     register(pong, spawn(tut17, pong, [])).  
            29.   
            30. start_ping(Pong_Node) ->  
            31.     spawn(tut17, ping, [3, Pong_Node]).  

                代碼是創(chuàng)建兩個(gè)相互通信的進(jìn)程,相互發(fā)送消息并通過(guò)io顯示在屏幕上,本來(lái)是一個(gè)單一系統(tǒng)的例子,現(xiàn)在我們讓兩個(gè)進(jìn)程運(yùn)行在不同的兩個(gè)節(jié)點(diǎn)上。注意 start_ping方法,創(chuàng)建的進(jìn)程調(diào)用ping方法,ping方法有兩個(gè)參數(shù),一個(gè)是發(fā)送消息的次數(shù),一個(gè)就是遠(yuǎn)程節(jié)點(diǎn)的name了,也就是我們將要 創(chuàng)建的進(jìn)程pong的所在節(jié)點(diǎn)。start_pong創(chuàng)建一個(gè)調(diào)用函數(shù)pong的進(jìn)程,并注冊(cè)為名字pong(因此在ping方法中可以直接發(fā)送消息給 pong)。
                我是在windows機(jī)器上測(cè)試,首先打開(kāi)兩個(gè)cmd窗口,并cd到Erlang的安裝目錄下的bin目錄,比如C:\Program Files\erl5.5.3\bin,將上面的程序存為tut17.erl,并拷貝到同一個(gè)目錄下。我們將創(chuàng)建兩個(gè)節(jié)點(diǎn),一個(gè)叫 ping@dennis,一個(gè)叫pong@dennis,其中dennis是我的機(jī)器名。見(jiàn)下圖:

            采用同樣的命令

            erl 
            -sname ping

            創(chuàng)建ping節(jié)點(diǎn)。然后在pong節(jié)點(diǎn)下執(zhí)行start_pong():


            OK,這樣就在節(jié)點(diǎn)pong上啟動(dòng)了pong進(jìn)程,然后在ping節(jié)點(diǎn)調(diào)用start_ping,傳入?yún)?shù)就是pong@dennis
            java 代碼
             
            1. tut17:start_ping(pong@dennis).  

            執(zhí)行結(jié)果如下圖:

            同樣在pong節(jié)點(diǎn)上也可以看到:


                結(jié)果如我們預(yù)期的那樣,不同節(jié)點(diǎn)上的兩個(gè)進(jìn)程相互通信如此簡(jiǎn)單。我們給模塊tut17增加一個(gè)方法,用于啟動(dòng)遠(yuǎn)程進(jìn)程,也就是調(diào)用spawn(Node,Module,Func,Args)方法:
            java 代碼
             
            1. start(Ping_Node) ->  
            2.     register(pong, spawn(tut17, pong, [])),  
            3.     spawn(Ping_Node, tut17, ping, [3, node()]).  

            pong進(jìn)程啟動(dòng)Ping_Node節(jié)點(diǎn)上的進(jìn)程ping。具體結(jié)果不再給出。
            posted on 2009-09-11 10:13 暗夜教父 閱讀(416) 評(píng)論(0)  編輯 收藏 引用 所屬分類: erlang

            <2009年9月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日韩欧美亚洲综合久久| 久久天天躁狠狠躁夜夜96流白浆 | 久久亚洲AV成人出白浆无码国产| 三级韩国一区久久二区综合| 久久久久人妻一区精品 | 亚洲午夜久久久久久久久久| 亚洲精品成人网久久久久久| 热久久这里只有精品| 久久棈精品久久久久久噜噜| 久久青草国产精品一区| 国产69精品久久久久观看软件 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 99久久精品九九亚洲精品| 久久精品国产精品亚洲艾草网美妙 | 国产精品久久久久影视不卡| 国产真实乱对白精彩久久| 2021最新久久久视精品爱| 91精品国产综合久久香蕉| 亚洲综合伊人久久综合| 久久强奷乱码老熟女网站| 久久亚洲高清观看| 99久久婷婷免费国产综合精品| 久久精品国产日本波多野结衣| 日日狠狠久久偷偷色综合免费| a级毛片无码兔费真人久久| 精品熟女少妇av免费久久| 人妻无码中文久久久久专区| 亚洲国产精品一区二区久久hs| 日韩欧美亚洲国产精品字幕久久久| 久久精品国产精品亜洲毛片 | 亚洲欧美国产精品专区久久| 伊人久久五月天| yy6080久久| 99久久无码一区人妻a黑| 国产A级毛片久久久精品毛片| 久久青青草原精品国产软件| 亚洲成av人片不卡无码久久| 亚洲国产成人精品91久久久 | 久久久久这里只有精品 | 成人国内精品久久久久一区| 欧美黑人激情性久久|