• <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應用是運行在一系列Erlang節點組成的網絡之上。這樣的系統的性質與單一節點上的Erlang系統并沒有什么不同。分布式這是個“大詞”,Erlang從語言原生角度支持分布式編程,相比于java簡單不少。
            一、分布式機制
            下列的BIFs是用于分布式編程:
            spawn(Node, Mod, Func, Args)
            啟動遠程節點的一個進程

            spawn_link(Node, Mod, Func, Args)
            啟動遠程節點的一個進程并創建連接到該進程

            monitor_node(Node, Flag)
            如果Flag是true,這個函數將使調用(該函數)的進程可以監控節點Node。如果節點已經舍棄或者并不存在,調用的進程將收到一個{nodedown,Node}的消息。如果Flag是false,監控將被關閉

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

            nodes()
            返回其他已知的節點name列表

            node(Item)
            返回原來Item的節點名稱,Item可以是Pid,引用(reference)或者端口(port)

            disconnect_node(Nodename)
            從節點Nodename斷開。

                節點是分布式Erlang的核心概念。在一個分布式Erlang應用中,術語(term)節點(node)意味著一個可以加入分布式 transactions的運行系統。通過一個稱為net kernal的特殊進程,一個獨立的Erlang系統可以成為一個分布式Erlang系統的一部分。當net kernal進程啟動的時候,我們稱系統是alive的。

                與遠程節點上的進程進行通信,與同一節點內的進程通信只有一點不同:
            java 代碼
            1. {Name, Node} ! Mess.  
              
            顯然,需要接收方增加一個參數Node用于指定接受進程所在的節點。節點的name一般是用@隔開的atom類型,比如pong@dennis,表示計算機名為dennis上的pong節點。通過執行:
            java 代碼
            1. erl -sname pong  

            將在執行的計算機中創建一個節點pong。為了運行下面的例子,你可能需要兩臺計算機,如果只有一臺,只要同時開兩個Erlang系統并以不同的節點名稱運行也可以。

            二、一些例子。
                這個例子完全來自上面提到的翻譯的連接,關于分布式編程的章節。我增加了截圖和說明。
            首先是代碼:
            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]).  

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

            采用同樣的命令

            erl 
            -sname ping

            創建ping節點。然后在pong節點下執行start_pong():


            OK,這樣就在節點pong上啟動了pong進程,然后在ping節點調用start_ping,傳入參數就是pong@dennis
            java 代碼
             
            1. tut17:start_ping(pong@dennis).  

            執行結果如下圖:

            同樣在pong節點上也可以看到:


                結果如我們預期的那樣,不同節點上的兩個進程相互通信如此簡單。我們給模塊tut17增加一個方法,用于啟動遠程進程,也就是調用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進程啟動Ping_Node節點上的進程ping。具體結果不再給出。
            posted on 2009-09-11 10:13 暗夜教父 閱讀(407) 評論(0)  編輯 收藏 引用 所屬分類: erlang

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

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久涩综合| 性做久久久久久久| 久久婷婷色综合一区二区| 一级a性色生活片久久无| 亚洲色欲久久久综合网| 国产成人久久精品激情| 久久最新免费视频| 亚洲精品美女久久久久99| AAA级久久久精品无码区| 18禁黄久久久AAA片| 久久精品国产亚洲欧美| 亚洲性久久久影院| 一本大道久久a久久精品综合 | 99久久香蕉国产线看观香| 国产精品久久久久久| 亚洲七七久久精品中文国产 | 国内精品久久久久影院老司| 久久久噜噜噜www成人网| 久久久免费观成人影院| 久久综合久久综合久久综合| 国内精品人妻无码久久久影院导航| 四虎国产精品免费久久5151| 欧美午夜精品久久久久免费视| 欧美日韩精品久久久免费观看| 亚洲精品国产成人99久久| 欧美一区二区三区久久综| 久久精品国产久精国产一老狼| 久久久久无码精品| 国产精品久久久久一区二区三区| 欧美一区二区三区久久综| 国内高清久久久久久| 精品国产日韩久久亚洲| 久久婷婷五月综合成人D啪| 香蕉99久久国产综合精品宅男自| 国产精品成人99久久久久| 久久亚洲国产精品一区二区| 国产精品99久久久久久人| 久久国产精品成人免费 | 久久亚洲精品无码AV红樱桃| 亚洲成色WWW久久网站| 性高湖久久久久久久久|