erlang 併發程式設計 併發01

2021-09-25 10:00:21 字數 4090 閱讀 9811

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...