erlang純訊息傳遞式語言
特點:建立新程序
%% 通過pid給次執行緒發訊息,mod模組,func方法,args傳入引數
pid = spawn(mod,func,args).
%% 新起乙個併發程序執行fun,fun的屬性是當前值
pid = spawn(fun).
傳送訊息
pid ! message
接受訊息
receive
pattern1 [when guard1] ->
expressions1;
pattern2 [when guard2] ->
expressions2;
...end%% 例子
loop() ->
receive
->
io:format([width * ht]),
loop();
->
io:format,
loop()
end.
自己給自己傳送訊息,每次收到訊息列印一次資料
-module(area_server1).
-export([loop/0,rpc/2]).
%% 傳送訊息,並監聽返回值
rpc(pid,request) ->
pid ! ,
recrive
response ->
response
end.
%% 開啟指定資料的 訊息監聽
loop() ->
receive
} ->
from ! width * ht,
loop();
} ->
from ! 3.14159 * r * r,
loop();
->
from ! ,
loop()
end.
pid = spawn(area_server1,loop,).
area_server1:rpc(pid,).
area_server1:rpc(pid,).
area_server1:rpc(pid,socks).
可以接收指定的pid訊息
rpc(pid,request) ->
pid ! ,
receive
-> %% 這裡指定接受和 傳送pid一樣的訊息
response
end.
上限:電腦會預設設定程序上限,不能無限的新增會消耗完電腦物理記憶體。
%% 查詢當前電腦設定的程序上限
erlang:system_info(process_limit).
%% +p 新增程序上限,超出預定值
erl +p 3000000
帶超時時間的接收資料
延遲執行定時器
-module(stimer).
-export([start/2,cancel/1]).
start(time,fun) -> spawn(fun() -> timer(time,fun) end).
cancel(pid) -> pid ! cancel.
timer(time,fun) ->
receive
cancel ->
void
after time ->
fun()
end.
週期性定時器
-module(stimer).
-export([start/2,cancel/1]).
start(time,fun) -> spawn(fun() -> timer(time,fun) end).
cancel(pid) -> pid ! cancel.
timer(time,fun) ->
receive
cancel ->
void
after time ->
fun(),
timer(time,fun)
end.
註冊程序,erlang註冊程序,之後使用程序名進行訊息傳送和接受
%% 註冊,名稱必須是原子。如果名稱已存在則會註冊失敗
register(anatom,pid).
%% 移除註冊
unregister(anatom).
%% 檢視該名稱是否已被註冊,成功返回pid,失敗返回undefined
whereis(anatom).
%% 查詢所有註冊資訊
registered().
例子:(使用直接使用註冊的原子即可)
pid = spawn(area_server,loop,).
register(area,pid).
area ! .
防禦式程式設計
讓程序崩潰,然後在其他程序裡糾正錯誤。
優點:術語含義:
程序(分普通程序和系統程序):spawn建立的是普通程序,通過process_flag(trap_exit,true)變成系統程序。
連線:2個程序連線後,乙個崩潰了會告訴另乙個崩潰原因。他們是相互的。收到崩潰訊息也就是乙個退出訊息,所有連線的程序都會關閉(除非是系統程序)。
連線組:多個程序在乙個組內,乙個崩潰,其他程序都會收到它的崩潰原因。
監視:a程序監視b,b崩潰了a就會知道。(不能是a崩潰b知道)a收到的是宕機訊息,a不會關閉本程序。
訊息和錯誤訊號:正常通訊是訊息,崩潰前喊出的是錯誤訊號
錯誤訊號:格式是{『exit』,pid,why}收到這個新號的程序退出原因不是normal也會終止。可以通過**終止(exit(why).終止自己。exit(pid,why)終止別人,當前程序不停止 )。系統程序收到(kill signal)會終止程序,是通過exit(pid,kill)生成的。它不會告訴連線的其他程序 崩潰原因。
建立連線link()
p1 呼叫link(p2) p1就會和p2建立乙個連線(相互連線的程序乙個崩潰了,連線的程序也會崩潰除非是系統程序(可以捕捉退出訊號)。)
建立方式
%% 類似於spawn(fun)和spawn(mod,func,args)的建立方式
%% 連線
%% 建立程序的同時建立連線
-spec spawn_link(fun) -> pid
-spec spawn_link(mod,fnc,args) ->pid
%% 建立乙個與指定程序的連線
-spec link(pid) -> true
%% 移除與當前執行緒繫結的指定連線
-spec unlink(pid) -> true
%% 建立程序的同時建立監視
-spec spawn_monitor(fun) ->
-spec spawn_monitor(mod,fnc,args) ->
%% 建立乙個與當前程序連線的監視
-spec erlang:monitor(process,ltem) -> ref
%% 移除乙個與當前程序連線的監視
-spec demonitor(ref) -> true
%% 當前程序轉換成系統程序
-spec process_flag(trap_exit,true)
%% 停止當前程序,並廣播崩潰原因
-spec exit(why) -> none()
%% 停止指定程序,並廣播關閉它的原因
-sepc exot(pid,why) -> true
監聽程序崩潰後的返回的錯誤訊息
on_exit(pid,fun) ->
spawn(fun() ->
ref = monitor(process,pid),
receive
->
fun(why)
endend).
Erlang併發程式設計 五 bigwig
bigwig erlang web 監控工具。參考資料 git clone 修改rebar.config,指定版本 預設是r14,如果當前系統使用r15需要則修改 獲取依賴。rebar get deps start ensure started crypto ensure started sasl ...
Erlang入門(二) 併發程式設計
erlang中的process 程序是輕量級的,並且程序間無共享。查了很多資料,似乎沒人說清楚輕量級程序算是什麼概念,繼續查詢中。閒話不提,進入併發程式設計的世界。本文算是學習筆記,也可以說是 concurrent programming in erlang 第五張的簡略翻譯。1.程序的建立 程序是...
golang併發程式設計 01
一 併發程式設計模板 func main wg.add 1 go func wg.wait 二 鎖住共享資源 1.原子函式 var counter int64 多個goroutine都會增加其值的變數 如果在goroutine中要對counter執行加法,那麼要用原子操作 atomic.addint...