erlang學習記錄(二)進程

erlang進程

erlang進程與操做系統進程不一樣,erlang進程的切換、生成和消息傳遞是由erlang虛擬機管理的。是erlang 併發單元的一個代稱。 每一個進程表明一個持續的活動,執行某一段代碼。在執行完畢後自動退出。閉包

建立、連接進程

erlang進程的建立由spawn()函數完成,spawn()經常使用的有如下兩種形式。併發

  1. spawn(Fun()).
  2. spawn(Module,Function,ListOfArgs).
  3. spawn_link(Fun()).
  4. spawn_link(Module,Funtion,ListOfArgs).

第二種方法要求給定的函數必須事先從模塊中導出,而且初始數據只能由參數列表傳入。同時,第二種方法老是採用模塊的最新版本。這些函數均返回新進程的Pid。spawn_link(...)將建立的進程與原進程連接起來,確保這兩個操做爲原子操做。函數

若是兩個進程互相鏈接,則一個進程終止時會像另外一個進程發錯誤信號{'EXIT',Pid,Reason}
建立連接的函數爲link(Pid),它將當前進程與Pid連接起來。spa

監視進程

連接的替代品。一種單向連接。由一下幾種函數完成操作系統

  1. spawn_monitor(Fun()).
  2. spwan_monitor(Module,Function,ListOfArgs).

被監視的進程退出會發消息給監視進程,監視進程退出則對被監視進程無影響。pwa

退出進程

一、拋出異常終結進程。

exit(Reason)code

除非被進程捕獲,不然該調用將令進程中止,並將Reason做爲退出信號的一部分發送給全部與該進程相連接的進程。對象

二、直接向進程發送退出信號

exit(Pid,Reason) 進程

該信號終止的是接收方。發送該信號時,收發雙方無需連接。
若是Reason是原子kill,則接受方沒法捕捉該信號,會被強制終止。get

三、設置trap_exit標誌

process_flag(trap_exit,true)

默認狀況下,進程收到連接的其餘進程的退出信號就會退出。設置trap_exit標誌能夠避免這種狀況。設置該標誌後,除了沒法捕捉的信號外,其餘的外來退出信息都會被轉換成無害的消息。

進程間消息的傳遞

receive
    Pattern1 when Guard1 -> 
            %% do some thing
    Pattern2 when Guard2 -> 
            %% do some thing
    after Time ->
        %% do some thing
    end

上面代碼中的關卡是爲了提取部分信息,若是省略則會接受全部消息。
after段也是可選的,若是省略,receive永不超時。不然 Time必須是表示毫秒數的整數或原子infinity。若是Time爲0。則receive永不阻塞,若是爲infinity,則receive永不超時。

註冊進程

register(name,Pid)

用於給進程綁定一個名字。方便對進程的操做。

消息投遞與信號

進程間信息傳遞除了用消息投遞符 ! 之外還有進程發出的退出信號和嘗試連接兩個進程時的連接請求

傳遞消息時,如下基本傳遞保障時對全部信號成立的

  1. 若是進程A向進程B前後發送了S1和S2。不管信號間隔由多久,這兩個信號都將按照發送順序到達。
  2. 盡力投遞全部信號。

進程字典

進程自身狀態的一部分,每一個進程都有一個私有的進程字典。這是一個能夠用任何值做爲鍵的簡單哈希表,用於存儲Erlang項。

經過內置函數put(key,value)get(key,value)能夠從中存取項。

儘可能使用Ets表。不要使用進程字典 。

erlang fun函數

erlang將函數視爲數據。將函數封裝成數據的對象稱爲fun函數(C++中的lamada表達式或者閉包)

函數有命名函數和匿名函數

命名函數能夠直接經過函數名調用,也能夠用來給其餘函數當參數。

匿名函數的形式爲fun()-> end.匿名函數必須與變量綁定,或者做爲參數傳遞給其餘函數,或者做爲函數返回值。

相關文章
相關標籤/搜索