Erlang 超時處理

2022-07-07 15:42 更新

Erlang超時處理

在改進 messager 程序之前,讓我們一起學習一些基本的原則。回憶一下,當 “ping” 結(jié)束的時候,它向 “pong” 發(fā)送一個原子值 finished 的消息以通知 “pong” 結(jié)束程序。另一種讓 “pong” 結(jié)束的辦法是當 “pong” 有一定時間沒有收到來自 “ping” 的消息時則退出程序。我們可在 pong 中添加一個 time-out 來實現(xiàn)它:

-module(tut19).

-export([start_ping/1, start_pong/0,  ping/2, pong/0]).

ping(0, Pong_Node) ->
    io:format("ping finished~n", []);

ping(N, Pong_Node) ->
    {pong, Pong_Node} ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_Node).

pong() ->
    receive
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    after 5000 ->
            io:format("Pong timed out~n", [])
    end.

start_pong() ->
    register(pong, spawn(tut19, pong, [])).

start_ping(Pong_Node) ->
    spawn(tut19, ping, [3, Pong_Node]).

編譯上面的代碼并將生成的 tut19.beam 文件拷貝到某個目錄下,下面是在結(jié)點 pong@kosken 上的輸出:

true
Pong received ping
Pong received ping
Pong received ping
Pong timed out

在結(jié)點 ping@gollum 上的輸出結(jié)果為:

(ping@gollum)1> tut19:start_ping(pong@kosken).
<0.36.0>
Ping received pong
Ping received pong
Ping received pong
ping finished 

time-out 被設置在:

pong() ->
    receive
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    after 5000 ->
            io:format("Pong timed out~n", [])
    end.

執(zhí)行 recieve 時,超時定時器 (5000 ms)啟動;一旦收到 {ping,Ping_PID} 消息,則取消該超時定時器。如果沒有收到 {ping,Ping_PID} 消息,那么 5000 毫秒后 time-out 后面的程序就會被執(zhí)行。after 必須是 recieve 中的最后一個,也就是說,recieve 中其它所有消息的接收處理都優(yōu)先于超時消息。如果有一個返回值為整數(shù)值的函數(shù),我們可以在 after 后調(diào)用該函數(shù)以將其返回值設為超時時間值,如下所示:

after pong_timeout() ->

一般地,除了使用超時來監(jiān)測分布式 Erlang 系統(tǒng)的各分部外,還有許多更好的辦法來實現(xiàn)監(jiān)測功能。超時適用于監(jiān)測來自于系統(tǒng)外部的事件,比如說,當你希望在指定時間內(nèi)收到來自外部系統(tǒng)的消息的時候。舉個例子,我們可以用超時來發(fā)現(xiàn)用戶離開了messager 系統(tǒng),比如說當用戶 10 分鐘沒有訪問系統(tǒng)時,則認為其已離開了系統(tǒng)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號