• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Erlang 超时处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Erlang超时处理

在改进 messager 程序之前,让我们一起学习一些基本的原则。回忆一下,当 “ping” 结束的时候,它向 “pong” 发送一个原子值 finished 的消息以通知 “pong” 结束程序。另一种让 “pong” 结束的办法是当 “pong” 有一定时间没有收到来自 “ping” 的消息时则退出程序。我们可在 pong 中添加一个 time-out 来实现它:

-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 文件拷贝到某个目录下,下面是在结点 pong@kosken 上的输出:

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

在结点 ping@gollum 上的输出结果为:

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

执行 recieve 时,超时定时器 (5000 ms)启动;一旦收到 {ping,Ping_PID} 消息,则取消该超时定时器。如果没有收到 {ping,Ping_PID} 消息,那么 5000 毫秒后 time-out 后面的程序就会被执行。after 必须是 recieve 中的最后一个,也就是说,recieve 中其它所有消息的接收处理都优先于超时消息。如果有一个返回值为整数值的函数,我们可以在 after 后调用该函数以将其返回值设为超时时间值,如下所示:

after pong_timeout() ->

一般地,除了使用超时来监测分布式 Erlang 系统的各分部外,还有许多更好的办法来实现监测功能。超时适用于监测来自于系统外部的事件,比如说,当你希望在指定时间内收到来自外部系统的消息的时候。举个例子,我们可以用超时来发现用户离开了messager 系统,比如说当用户 10 分钟没有访问系统时,则认为其已离开了系统。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Erlang 错误处理发布时间:2022-01-22
下一篇:
Erlang 健壮性发布时间:2022-01-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap