• <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中的process——進程是輕量級的,并且進程間無共享。查了很多資料,似乎沒人說清楚輕量級進程算是什么概念,繼續查找中。。。閑話不 提,進入并發編程的世界。本文算是學習筆記,也可以說是《Concurrent Programming in ERLANG》第五張的簡略翻譯。
            1.進程的創建
                進程是一種自包含的、分隔的計算單元,并與其他進程并發運行在系統中,在進程間并沒有一個繼承體系,當然,應用開發者可以設計這樣一個繼承體系。
                進程的創建使用如下語法:
            java 代碼
            1. Pid = spawn(Module, FunctionName, ArgumentList)  

            spawn接受三個參數:模塊名,函數名以及參數列表,并返回一個代表創建的進程的標識符(Pid)。
            如果在一個已知進程Pid1中執行:
            java 代碼
            1. Pid2 = spawn(Mod, Func, Args)  

            那么,Pid2僅僅能被Pid1可見,Erlang系統的安全性就構建在限制進程擴展的基礎上。

            2.進程間通信
                Erlang進程間的通信只能通過發送消息來實現,消息的發送使用!符號:
            java 代碼
            1. Pid ! Message  

                其中Pid是接受消息的進程標記符,Message就是消息。接受方和消息可以是任何的有效的Erlang結構,只要他們的結果返回的是進程標記符和消息。
                消息的接受是使用receive關鍵字,語法如下:
            java 代碼
            1. receive  
            2.       Message1 [when Guard1] ->  
            3.           Actions1 ;  
            4.       Message2 [when Guard2] ->  
            5.           Actions2 ;  
            6.   
            7. end  

                每一個Erlang進程都有一個“郵箱”,所有發送到進程的消息都按照到達的順序存儲在“郵箱”里,上面所示的消息Message1,Message2, 當它們與“郵箱”里的消息匹配,并且約束(Guard)通過,那么相應的ActionN將執行,并且receive返回的是ActionN的最后一條執行 語句的結果。Erlang對“郵箱”里的消息匹配是有選擇性的,只有匹配的消息將被觸發相應的Action,而沒有匹配的消息將仍然保留在“郵箱”里。這 一機制保證了沒有消息會阻塞其他消息的到達。
                消息到達的順序并不決定消息的優先級,進程將輪流檢查“郵箱”里的消息進行嘗試匹配。消息的優先級別下文再講。

                如何接受特定進程的消息呢?答案很簡單,將發送方(sender)也附送在消息當中,接收方通過模式匹配決定是否接受,比如:
            java 代碼
            1. Pid ! {self(),abc}  

            給進程Pid發送消息{self(),abc},利用self過程得到發送方作為消息發送。然后接收方:
            java 代碼
            1. receive  
            2.   {Pid1,Msg} ->  
            3.   
            4. end  

            通過模式匹配決定只有Pid1進程發送的消息才接受。

            3.一些例子
                僅說明下書中計數的進程例子,我添加了簡單注釋:
            java 代碼
             
            1. -module(counter).  
            2. -compile(export_all).  
            3. % start(),返回一個新進程,進程執行函數loop  
            4. start()->spawn(counter, loop,[0]).  
            5. % 調用此操作遞增計數  
            6. increment(Counter)->  
            7.     Counter!increament.  
            8. % 返回當前計數值  
            9. value(Counter)->  
            10.     Counter!{self(),value},  
            11.     receive  
            12.         {Counter,Value}->  
            13.             %返回給調用方  
            14.             Value  
            15.         end.  
            16.   %停止計數        
            17.  stop(Counter)->  
            18.      Counter!{self(),stop}.  
            19.  loop(Val)->  
            20.      receive  
            21.          %接受不同的消息,決定返回結果  
            22.          increament->  
            23.              loop(Val+1);  
            24.          {From,value}->  
            25.              From!{self(),Val},  
            26.              loop(Val);  
            27.          stop->  
            28.              true;  
            29.          %不是以上3種消息,就繼續等待  
            30.          Other->  
            31.              loop(Val)  
            32.       end.     
            33.                
            34.                           
            35.           

            調用方式:

            java 代碼
             
            1. 1> Counter1=counter:start().  
            2. <0.30.0>  
            3. 2> counter:value(Counter1).  
            4. 0  
            5. 3> counter:increment(Counter1).  
            6. increament  
            7. 4> counter:value(Counter1).  
            8. 1  

            基于進程的消息傳遞機制可以很容易地實現有限狀態機(FSM),狀態使用函數表示,而事件就是消息。具體不再展開

            4.超時設置
                Erlang中的receive語法可以添加一個額外選項:timeout,類似:
            java 代碼
            1. receive  
            2.    Message1 [when Guard1] ->  
            3.      Actions1 ;  
            4.    Message2 [when Guard2] ->  
            5.      Actions2 ;  
            6.      
            7.    after  
            8.       TimeOutExpr ->  
            9.          ActionsT  
            10. end  

            after之后的TimeOutExpr表達式返回一個整數time(毫秒級別),時間的精確程度依賴于Erlang在操作系統或者硬件的實現。如果在time毫秒內,沒有一個消息被選中,超時設置將生效,也就是ActionT將執行。time有兩個特殊值:
            1)infinity(無窮大),infinity是一個atom,指定了超時設置將永遠不會被執行。
            2) 0,超時如果設定為0意味著超時設置將立刻執行,但是系統將首先嘗試當前“郵箱”里的消息。

                超時的常見幾個應用,比如掛起當前進程多少毫秒:
            java 代碼
             
            1. sleep(Time) ->  
            2.   receive  
            3.     after Time ->  
            4.     true  
            5. end.  

                比如清空進程的“郵箱”,丟棄“郵箱”里的所有消息:
            java 代碼
             
            1. flush_buffer() ->  
            2.   receive  
            3.     AnyMessage ->  
            4.       flush_buffer()  
            5.   after 0 ->  
            6.     true  
            7. end.  
               
                將當前進程永遠掛起:
            java 代碼
             
            1. suspend() ->  
            2.     receive  
            3.     after  
            4.         infinity ->  
            5.             true  
            6.     end.  

                   超時也可以應用于實現定時器,比如下面這個例子,創建一個進程,這個進程將在設定時間后向自己發送消息:
            java 代碼
             
            1. -module(timer).  
            2. -export([timeout/2,cancel/1,timer/3]).  
            3. timeout(Time, Alarm) ->  
            4.    spawn(timer, timer, [self(),Time,Alarm]).  
            5. cancel(Timer) ->  
            6.    Timer ! {self(),cancel}.  
            7. timer(Pid, Time, Alarm) ->  
            8.    receive  
            9.     {Pid,cancel} ->  
            10.        true  
            11.    after Time ->  
            12.        Pid ! Alarm  
            13. end.  

               
            5、注冊進程
                為了給進程發送消息,我們需要知道進程的Pid,但是在某些情況下:在一個很大系統里面有很多的全局servers,或者為了安全考慮需要隱藏進程 Pid。為了達到可以發送消息給一個不知道Pid的進程的目的,我們提供了注冊進程的辦法,給進程們注冊名字,這些名字必須是atom。
                基本的調用形式:
            java 代碼
            1. register(Name, Pid)  
            2. 將Name與進程Pid聯系起來  
            3.   
            4. unregister(Name)  
            5. 取消Name與相應進程的對應關系。  
            6.   
            7. whereis(Name)  
            8. 返回Name所關聯的進程的Pid,如果沒有進程與之關聯,就返回atom:undefined  
            9.   
            10. registered()  
            11. 返回當前注冊的進程的名字列表  

            6.進程的優先級
            設定進程的優先級可以使用BIFs:
            process_flag(priority, Pri)

            Pri可以是normal、low,默認都是normal
            優先級高的進程將相對低的執行多一點。

            7.進程組(process group)
                所有的ERLANG進程都有一個Pid與一個他們共有的稱為Group Leader相關聯,當一個新的進程被創建的時候將被加入同一個進程組。最初的系統進程的Group Leader就是它自身,因此它也是所有被創建進程及子進程的Group Leader。這就意味著Erlang的進程被組織為一棵Tree,其中的根節點就是第一個被創建的進程。下面的BIFs被用于操縱進程組:
            group_leader()
            返回執行進程的Group Leader的Pid
            group_leader(Leader, Pid)
            設置進程Pid的Group Leader為進程的Leader

            8.Erlang的進程模型很容易去構建Client-Server的模型,書中有一節專門討論了這一點,著重強調了接口的設計以及抽象層次的隔離問題,不翻譯了。
            posted on 2009-09-11 10:12 暗夜教父 閱讀(298) 評論(0)  編輯 收藏 引用 所屬分類: erlang

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品美女久久久久AV福利| 婷婷久久精品国产| 香蕉久久夜色精品升级完成 | 久久久久久国产精品免费无码| 囯产极品美女高潮无套久久久| 青青草原精品99久久精品66| 久久精品国产亚洲欧美| 久久亚洲欧洲国产综合| 亚洲av日韩精品久久久久久a | 久久国产香蕉一区精品| 亚洲&#228;v永久无码精品天堂久久| 亚洲精品无码久久久| 久久美女网站免费| 中文字幕人妻色偷偷久久| 94久久国产乱子伦精品免费 | 国产精品一区二区久久精品无码 | 无码人妻少妇久久中文字幕| 久久ZYZ资源站无码中文动漫| 亚洲欧美国产精品专区久久| 99精品久久精品| 性做久久久久久久| 久久亚洲国产成人影院网站| 91精品国产综合久久婷婷| 亚洲午夜久久久久妓女影院| 久久久99精品成人片中文字幕| 99久久免费国产特黄| 欧美喷潮久久久XXXXx| 久久精品国产免费观看| 婷婷久久五月天| 久久强奷乱码老熟女网站| 久久精品不卡| 无码精品久久一区二区三区| 精品无码人妻久久久久久| 久久精品一区二区| 97精品国产97久久久久久免费| 成人国内精品久久久久一区| 久久综合给合久久狠狠狠97色69| 婷婷综合久久中文字幕蜜桃三电影| 少妇无套内谢久久久久| 久久久久久久精品成人热色戒| 中文字幕无码av激情不卡久久|