erlang進程與操做系統進程不一樣,erlang進程的切換、生成和消息傳遞是由erlang虛擬機管理的。是erlang 併發單元的一個代稱。 每一個進程表明一個持續的活動,執行某一段代碼。在執行完畢後自動退出。閉包
erlang進程的建立由spawn()
函數完成,spawn()
經常使用的有如下兩種形式。併發
- spawn(Fun()).
- spawn(Module,Function,ListOfArgs).
- spawn_link(Fun()).
- spawn_link(Module,Funtion,ListOfArgs).
第二種方法要求給定的函數必須事先從模塊中導出,而且初始數據只能由參數列表傳入。同時,第二種方法老是採用模塊的最新版本。這些函數均返回新進程的Pid。spawn_link(...)
將建立的進程與原進程連接起來,確保這兩個操做爲原子操做。函數
若是兩個進程互相鏈接,則一個進程終止時會像另外一個進程發錯誤信號{'EXIT',Pid,Reason}
。
建立連接的函數爲link(Pid)
,它將當前進程與Pid連接起來。spa
連接的替代品。一種單向連接。由一下幾種函數完成操作系統
- spawn_monitor(Fun()).
- spwan_monitor(Module,Function,ListOfArgs).
被監視的進程退出會發消息給監視進程,監視進程退出則對被監視進程無影響。pwa
exit(Reason)
code
除非被進程捕獲,不然該調用將令進程中止,並將Reason
做爲退出信號的一部分發送給全部與該進程相連接的進程。對象
exit(Pid,Reason)
進程
該信號終止的是接收方。發送該信號時,收發雙方無需連接。
若是Reason
是原子kill
,則接受方沒法捕捉該信號,會被強制終止。get
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)
用於給進程綁定一個名字。方便對進程的操做。
進程間信息傳遞除了用消息投遞符 !
之外還有進程發出的退出信號
和嘗試連接兩個進程時的連接請求
。
傳遞消息時,如下基本傳遞保障時對全部信號成立的
- 若是進程A向進程B前後發送了S1和S2。不管信號間隔由多久,這兩個信號都將按照發送順序到達。
- 盡力投遞全部信號。
進程自身狀態的一部分,每一個進程都有一個私有的進程字典。這是一個能夠用任何值做爲鍵的簡單哈希表,用於存儲Erlang項。
經過內置函數put(key,value)
和get(key,value)
能夠從中存取項。
儘可能使用Ets表。不要使用進程字典 。
erlang將函數視爲數據。將函數封裝成數據的對象稱爲fun函數(C++中的lamada表達式或者閉包)
函數有命名函數和匿名函數
命名函數能夠直接經過函數名調用,也能夠用來給其餘函數當參數。
匿名函數的形式爲fun()-> end
.匿名函數必須與變量綁定,或者做爲參數傳遞給其餘函數,或者做爲函數返回值。