Erlang中基本的并發函數
1) Pid =spwan(Mod,Func,Args) 創建1個新的進程來履行apply(Mod,Func,Args),與調用進程并列運行,會使用最新的代碼定義模塊。
2) Pid!Message 向Pid進程異步發送Message,!為發送操作符
3) Receive … end 接收消息
receive
Pattern1[when Guard1]-> Expression1;
Pattern2[whenGuard2]->Expression2;
…
aftertime->
Expressions
end.
內置函數erlang:system_info(process_limit)可找出所允許的最大進程數,默許為262144.
進程注冊的內置函數有:
register(AnAtom,Pid)用名稱注冊Pid
uregister(AnAtom) 注銷關聯注冊
whereis(AnAtom)->Pid|undefined 檢查Pid是不是注冊
registered()->[AnAtom::atom()]返回系統里所有注冊進程的列表。
并發程序模板:
-module(ctemplate).
-compile(export_all).
start() ->
Spwan(?MODULE,loop,[]).
rpc(Pid,Request) ->
Pid! {self(),Request},
receive
{Pid,Respone}->
Response
end.
loop(X) ->
receive
Any->
Io:format(“Received:~p ~n”, [Any]),
loop(X)
end.
每當收到消息時會處理它并再次調用loop(),這1進程稱為尾遞歸,無需消耗堆棧空間可以1直循環下去。
Erlang并發程序的毛病處理建立在遠程監測和處理毛病的基礎上,重點在補救而不是預防,幾近沒有防御性代碼,只有在毛病后清算系統的代碼,即讓其他進程修復毛病和任其崩潰。
程序在出錯時立即崩潰的優點:
1) 不編寫防御性代碼,直接崩潰簡單
2) 他人來修復
3) 不會使毛病惡化
4) 第1時間舉旗示意
5) 修復時不擔心緣由重在清算
6) 簡化了系統架構
監視和連接類似,但監視是單向的,如果被監視的進程掛了會向監視進程發1“宕機“消息,而不是退出信號。基本毛病處理函數有:
-spec spwan_link(Fun) ->Pid
-spec spwan_monitor(Fun)-> {Pid,Ref}
-spec process_flag(trap_exit,true)
-spec link(Pid) ->true
-spec unlink(Pid) -> true
-spec erlang:monitor(process,Item) ->Ref
-spec exit(Why) -> none()
散布式模型:散布式erlang 和基于socket的散布式模型。散布式erlang運行在可信網絡,通常在同1局域網的集群上,并受防火墻保護。基于socket的散布式模型基于TCP/IP不可信網絡.
散布式Erlang的主要問題在于客戶端可以自行決定在服務器上分裂出多種進程,合適于你具有全部的機器,并且想在單臺機器上控制他們。lib_chan 模塊讓用戶能夠顯式控制自己的機器分裂出哪些進程。
為了在互聯網上履行并發程序:
1) 確保4369端口對TCP和UDP都開發,該端口保存給epmd(Erlang端口映照守護進程)
2) 選擇1個或1段連續的端口給散布式erlang使用,確保這些端口開放,例如:
$erl -name …-setcookie … -kernelinet_dist_listen_min Min
Inet_dist_listen_maxMax
Rpc提供了許多遠程調用服務,global里的函數可以用來在散布式系統里注冊名稱和保護1個全連接的網絡。
Erlang集群就是1組帶有相同cookie的互連節點。創建cookie的3種方法:
1) 在文件$HOME/.erlang.cookie寄存相同的cookie
2) 在Erlang啟動時,可以用