• <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 暗夜教父 閱讀(409) 評論(0)  編輯 收藏 引用 所屬分類: erlang

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

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久噜噜噜久久| 91精品国产综合久久精品| 久久久久久国产a免费观看不卡| 精品久久久久久综合日本| 伊人久久大香线焦综合四虎| 久久精品亚洲欧美日韩久久 | 精品国产婷婷久久久| 久久精品国产精品亚洲人人| 亚洲国产成人久久综合碰| 色欲久久久天天天综合网| 国产色综合久久无码有码| 久久久久人妻一区二区三区| 亚洲国产精品综合久久一线| 一本久久精品一区二区| 久久久久免费精品国产| 亚洲中文字幕久久精品无码APP| 国产精品久久久久影院嫩草 | 国内精品久久久久久不卡影院 | 青青国产成人久久91网| 热re99久久6国产精品免费| 亚洲∧v久久久无码精品| 精品久久亚洲中文无码| 无码国内精品久久人妻蜜桃| 精品久久久无码人妻中文字幕豆芽 | 久久婷婷午色综合夜啪| 久久精品国产亚洲AV忘忧草18| 久久久久久伊人高潮影院| 国产精品毛片久久久久久久| 中文字幕热久久久久久久| 久久久久国产精品麻豆AR影院| 97精品久久天干天天天按摩 | 欧美国产成人久久精品| 久久久久女人精品毛片| 久久国产香蕉视频| 要久久爱在线免费观看| 国产精品丝袜久久久久久不卡| 久久综合久久综合亚洲| 久久精品国产一区二区三区日韩| 色婷婷久久久SWAG精品| 久久久久久久波多野结衣高潮| 狠狠色丁香婷综合久久|