<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    Erlang入門(mén)(三)——分布式編程

    Posted on 2007-06-15 17:33 dennis 閱讀(5503) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): erlang
        明天要回家一個(gè)星期了,好好休息下。今天找到別人翻譯的Erlang編程手冊(cè),值的好好讀一遍。
        所謂分布式的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)名稱(chēng),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è)稱(chēng)為net kernal的特殊進(jìn)程,一個(gè)獨(dú)立的Erlang系統(tǒng)可以成為一個(gè)分布式Erlang系統(tǒng)的一部分。當(dāng)net kernal進(jìn)程啟動(dòng)的時(shí)候,我們稱(chēng)系統(tǒng)是alive的。

        與遠(yuǎn)程節(jié)點(diǎn)上的進(jìn)程進(jìn)行通信,與同一節(jié)點(diǎn)內(nèi)的進(jìn)程通信只有一點(diǎn)不同:
      
       {Name, Node} ! Mess.
    顯然,需要接收方增加一個(gè)參數(shù)Node用于指定接受進(jìn)程所在的節(jié)點(diǎn)。節(jié)點(diǎn)的name一般是用@隔開(kāi)的atom類(lèi)型,比如pong@dennis,表示計(jì)算機(jī)名為dennis上的pong節(jié)點(diǎn)。通過(guò)執(zhí)行:
    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)名稱(chēng)運(yùn)行也可以。

    二、一些例子。
        這個(gè)例子完全來(lái)自上面提到的翻譯的連接,關(guān)于分布式編程的章節(jié)。我增加了截圖和說(shuō)明。
    首先是代碼:
    -module(tut17).

    -export([start_ping/1, start_pong/0,  ping/2, pong/0]).

    ping(
    0, Pong_Node) ->
        {pong
    , Pong_Node} ! finished,
        io
    :format("ping finished~n", []);

    ping(N
    , Pong_Node) ->
        {pong
    , Pong_Node} ! {ping, self()},
        receive
            pong 
    ->
                io
    :format("Ping received pong~n", [])
        end
    ,
        ping(N 
    - 1, Pong_Node).

    pong() 
    ->
        receive
            finished 
    ->
                io
    :format("Pong finished~n", []);
            {ping
    , Ping_PID} ->
                io
    :format("Pong received ping~n", []),
                Ping_PID 
    ! pong,
                pong()
        end
    .

    start_pong() 
    ->
        register(pong
    , spawn(tut17, pong, [])).

    start_ping(Pong_Node) 
    ->
        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了,也就是我們將要?jiǎng)?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
    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)方法:
    start(Ping_Node) ->
        register(pong
    , spawn(tut17, pong, [])),
        spawn(Ping_Node
    , tut17, ping, [3, node()]).
    pong進(jìn)程啟動(dòng)Ping_Node節(jié)點(diǎn)上的進(jìn)程ping。具體結(jié)果不再給出。



        


    評(píng)論

    # re: Erlang入門(mén)(三)——分布式編程  回復(fù)  更多評(píng)論   

    2013-04-21 13:43 by 楊雪松
    ping節(jié)點(diǎn)給pong節(jié)點(diǎn)發(fā)消息的時(shí)候用的是{Pid, Node}來(lái)確定目標(biāo),而pong回復(fù)消息給ping時(shí)直接用了Pid沒(méi)有指名Node,這里為何可以省去Node信息呢?
    主站蜘蛛池模板: 亚洲欧洲日本在线观看| 日韩免费a级毛片无码a∨| mm1313亚洲国产精品无码试看| 久久亚洲AV无码精品色午夜麻| 国产午夜免费秋霞影院| 免费A级毛片无码A∨免费| 一级成人毛片免费观看| 亚洲人成网站在线在线观看| 无码乱人伦一区二区亚洲| 亚洲精品无码日韩国产不卡?V | 国内大片在线免费看| 免费国产污网站在线观看15| 一级成人a免费视频| 国产精品亚洲一区二区三区久久| 亚洲国产精品久久人人爱| 亚洲成色在线影院| 亚洲色成人WWW永久网站| 亚洲国产成人久久综合碰| 成人免费无毒在线观看网站| 免费人成在线观看69式小视频| 久久福利青草精品资源站免费 | 国产一级淫片免费播放| 成人性生活免费视频| 五月婷婷综合免费| 18禁男女爽爽爽午夜网站免费| 好紧我太爽了视频免费国产| eeuss草民免费| 一级毛片一级毛片免费毛片| 免费无遮挡无码视频在线观看| 久久亚洲AV成人无码国产电影 | 成年女人看片免费视频播放器| 最近最好最新2019中文字幕免费| 久久久久国色av免费看| 免费看的一级毛片| 无码国产精品一区二区免费I6| 日本XXX黄区免费看| 免费看成人AA片无码视频羞羞网| 最近在线2018视频免费观看| 美丽的姑娘免费观看在线播放| 中文字幕在线免费| 天天影视色香欲综合免费|