Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求。Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。当某个进程出错退出时,其他进程都会收到该进程退出的消息通知。有了这些特点,使用erlang建立一个简单,并且健壮的系统就不是什么难事。
进程双向监控-Link
link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。
例子1:
-module(test).
-export([start/0]).
start() ->
Pid = spawn(fun() ->loop() end),
Pid2 = spawn(fun() ->loop_link(Pid) end),
io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]).
loop_link(Pid) ->
process_flag(trap_exit, true),
erlang:link(Pid),
receive
Msg ->
io:format("pid exit: ~p~n", [Msg])
end.
loop() ->
process_flag(trap_exit, true),
receive
Msg ->
io:format("pid2 exit: ~p~n", [Msg])
end.
运行代码:
1> test:start().
Pid <0.63.0>
Pid2 <0.64.0>
ok
%% 杀掉Pid进程,进程Pid2收到通知
2> exit(pid(0,63,0),kill).
pid exit: {'EXIT',<0.63.0>,killed}
true
3> test:start().
Pid <0.67.0>
Pid2 <0.68.0>
ok
%% 杀掉Pid2进程,进程Pid收到通知
4> exit(pid(0,68,0),kill).
pid2 exit: {'EXIT',<0.68.0>,killed}
true
注:erlang进程默认不捕捉Exit信号,可以使用process_flag(trap_exit, true)改变这一默认行为。
注2:解除link监控用erlang:unlink(Pid)
进程单向监控-Monitor
Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。
例子2:
-module(test).
-export([start/0]).
start() ->
Pid = spawn(fun() ->loop() end),
Pid3 = spawn(fun() ->loop_monitor(Pid) end),
io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]).
loop_monitor(Pid) ->
_MonitorRef = erlang:monitor(process, Pid),
receive
Msg ->
io:format("pid exit: ~p~n", [Msg])
end.
loop() ->
receive
Msg ->
io:format("pid3 exit: ~p~n", [Msg])
end.
运行代码:
1> test:start().
Pid <0.39.0>
Pid3 <0.40.0>
ok
%% 杀掉Pid进程,进程Pid3收到通知
2> exit(pid(0,39,0),kill).
pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}
true
3> test:start().
Pid <0.43.0>
Pid3 <0.44.0>
ok
%% 杀掉Pid3进程,进程Pid没有收到通知
4> exit(pid(0,44,0),kill).
true
注:解除monitor监控用erlang:demonitor(MonitorRef)
如果进程是以 normal 方式退出,erlang将不会发出进程退出通知
10> exit(pid(0,70,0), normal).
true
分享到:
相关推荐
在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过一个名为"bank2"的实例来探讨`link`的功能和影响。 首先,让我们理解什么是进程`link`。在...
《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF
Windows上安装RabbitMQ服务,依赖的Erlang语言安装包:otp_win64_25.2.1.exe 重要:Erlang安装程序必须【以管理员身份运行】,否则RabbitMQ安装程序相关信息不会在注册表项中不存在。
Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...
在Erlang的 OTP(Open Telecom Platform)框架中,监督者是一种特殊类型的进程,用于管理和监控其他进程,确保系统的容错性。当被监督的进程崩溃时,监督者可以按照预定义的策略重启它或者整个子树。 5. 示例:...
2. **链接和监视器的局限性**:Erlang中的链接(link)和监视器(monitor)机制可以用来检测进程失败并通知其他进程,这对于构建健壮的应用程序至关重要。然而,这些机制并不能确保进程语义上的正确性。例如,如果一个...
8. **监控和调试**:Erlang提供了强大的监控工具如observer和dbg,方便开发者对系统进行性能监控和问题定位,这对于维护一个高流量的游戏后端至关重要。 9. **服务器优化**:通过合理的进程调度、内存管理和并发...
编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的可伸缩性特征 erlang VM内部数据共享机制 erlang 消息传递机制 文章地址:...
它是原始改进版本,可与新的和现代的堆栈配合使用。 埃尔朗菲 讲出Erlang网络协议并模拟网络上的Erlang节点。 完全能够与Erlang进行双向通信。 在合理范围内,Erlang类型已映射到Haskell类型。 发给Erlang的消息只是...
4. 并发编程:探讨Erlang进程间的同步和异步通信,以及避免竞态条件和死锁的方法。 5. 容错与恢复:了解Erlang的故障检测和恢复机制,以及如何利用OTP库来实现系统的高可用性。 6. 热代码升级:学习如何在不中断服务...
监督树是Erlang OTP设计原则的重要组成部分,它用于管理进程的生命周期和故障恢复。当一个进程失败时,监督树会根据预定义的策略重启它或者其子进程,确保系统的稳定运行。这种机制使得Erlang系统能够自我修复并保持...
他的作品《孟岩谈Erlang:并行计算和云计算》详细解读了Erlang在这些领域的应用,涵盖了语言基础、并发模型、分布式系统设计以及实际案例分析,是学习Erlang和理解其在现代计算领域应用的重要参考资料。 综上所述,...
`bank1_sup`模块应包含一个`supervisor`行为的实现,负责启动和监控子进程。 5. **模块和功能**:在`src`目录下的`bank1.erl`等模块中,定义了应用的具体功能。例如,对于银行应用,可能有账户管理、转账等功能。每...
该模块提供了一些公共功能来执行诸如处理数据库,文档和视图之类的操作。 实现的功能确实很有限,因为我只真正实现了我在《玩魔兽》中使用的内容。 获取服务器信息 建立资料库 获取数据库信息 建立文件 创建具有...
erlang_ls 一个实现微软语言服务器协议 3.15 的 Erlang 服务器。最低要求 快速开始编译项目: make要在/usr/local/bin安装生成的erlang_ls escript: make install命令行参数这些是可以提供给erlang_ls脚本的命令行...
Xapian是一个高度适应性强的工具包,它使开发人员可以轻松地在其自己的应用程序中添加高级索引和搜索功能。 Xapian图书馆 安装Xapian库本身。 在Gentoo Linux中emerge dev-libs/xapian 。 安装 我用钢筋建造。 ...
1. **并发处理**:Erlang是一种面向并发的编程语言,其虚拟机(BEAM)设计支持轻量级进程,使得Erlang系统能同时处理大量并发任务,这正是RabbitMQ处理高并发消息需求的理想选择。 2. **容错性**:Erlang的错误恢复...
Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...
在Erlang中,你可以使用`erlang:monitor_node/2`和`erlang:demonitor/1`函数来监控和取消监控其他节点的状态。当需要两个未连通的节点C和D进行通信时,可以在节点C上执行: ```erlang erlang:monitor_node(node(d),...
它们是Erlang进程模型的一部分,具有独立的内存空间和消息队列。 8. **引用(Ref)**:引用是全局唯一的标识符,主要用于跨节点的通信。它们可以在不同Erlang节点之间创建和传递,但不能在运行时解引用。 9. **...