进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
操纵进程:
1.派生和链接
进程派生函数有两个:第一个函数仅有一个参数,就是用作新进程入口的(空元)fun函数;另一个则需要模块名、函数名和参数列表三个参数。
所有这些派生的函数都会返回新进程的进程标识符,通过标识符父进程可以和新进程通信。然而新进程对父进程却一无所知,只能通过其他方式获悉相关消息。
2.进程监视
链接有一个替代品,称作监视。这是一种单向链接,可以让一个进程在不影响目标的情况下对目标进程施行监视。
Ref = monitor(process, Pid)
由Pid标识的进程一旦退出,实施监视的进程将会受到一条含有唯一引用的Ref消息。
3.靠抛异常来终结进程
exit类异常用于终止运行中的进程。除非被进程捕获,否则该调用将令进程终止。
4.直接向进程发送退出信号
进程除了在意外退出时会自动发送信号外,还可以直接向其他进程发出退出信号。收发的双方无需链接: exit(Pid, Reason) 注意:该信号终止的不是发送方,而是接收方。
5.设置trap_exit标志
一旦接收到来自相互链接的其他进程的退出信号,默认情况下进程就会退出。为了避免这种行为并捕捉到退出信号,可以给进程设置trap_exit标志: process_flag(trap_exit, true) 如此一来,除了(kill)信号无法捕捉外,其他外来的退出信号都会被转换成无害的消息。
接收消息与选择性接收:
接收消息的进程可以通过receive表达式从信箱队列中提取消息。尽管接收到的消息都是按照先后顺序排列,接收方仍然可以决定提取哪条消息。选择性的忽略当前不太重要的信息,这是erlang进程通信的一个关键特性。
每次执行时,receive会先检查最老的消息(位于队列头部),像在case表达式中那样尝试将消息与子句匹配,如果找不到匹配的子句,就几句检查下一条。如果某条子句的模式与消息匹配成功,且保护式成立,该消息就会被移除信箱,同时与子句所对应的正文将被执行。如果一直等到超时也没有等到匹配的消息,那么超时部分对应的正文将会被执行,信箱维持原样。
注册进程:
Erlang系统都会有一个本地进程注册表——这是一个用于注册进程的简单命名服务。一个名称一次只能用于一个进程,换言之这种情况仅适用于单例模式:一般都是些系统服务,这些服务在每个运行时系统中同一时刻最多只能有一个实例。
启动erlang shell并调用内置函数registered(),如下图所示:
Erlang系统本身很像是跑着一组重要系统服务的操作系统。使用内置函数whereis()可以查找当前与指定注册名对应的pid,如下图所示:
下面这种情况完全体现出了注册进程的主要优点:假设某注册进程崩溃,对应的服务被重启,新进程的进程标识符会发生变化。此时无需将新进程服务的新pid逐个通知给系统中的所有进程,只要更新进程注册表即可。(但在服务完成重启和注册之前,会存在一段时间的真空期,期间该名称不指向任何进程。)
消息投递与信号:
Erlang进程之间用!运算符互相发送消息,这种消息只是erlang通用信号系统的一种特殊形式。有一大类信号是濒死进程向与之链接的相邻进程发送的退出信号;还有一小类信号是程序员不可见的,比如尝试链接两个进程时发送的链接请求。
投递信号有两种基本投递保障对所有信号都成立:①如果进程P1向同一个目标进程P2先后发送了S1和S2两个信号(不论进程在发送S1与S2之间做了什么,也不论两个信号之间发送间隔多久),这两个信号按发送顺序抵达P2(如果都能到)。如此一来,就说明退出信号绝不会掩盖进程临死前的最后一条消息,消息也绝不会掩盖链接请求。这是erlang进程间通信的基础。②尽力投递所有信号。同一erlang运行时系统内,进程之间不会存在消息丢失的危险。但是在两个需要网络互联的erlang系统之间,一旦网络断开链接,就存在丢失消息的可能(部分依赖传输协议)。连接回复之后,有可能出现上例中S2抵达S1丢失的情况。
相关推荐
Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...
由于Erlang进程是独立的,当一个进程崩溃时,它不会影响其他进程。OTP的错误处理机制允许系统优雅地处理错误,恢复到稳定状态。Supervisors可以配置为简单的一次重启、有限次数的重启或停止整个子树,从而避免无限...
Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...
2. **掌握并发编程**:习题可能包含创建和管理Erlang进程、实现进程间的消息传递,帮助学习者理解并发编程的核心概念。 3. **函数式编程思维**:习题可能涉及无副作用函数的编写,以及如何利用函数式编程特性如递归...
"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...
Erlang 是一种高效、并发、面向进程的编程语言,常用于构建分布式系统。在 Erlang 中,Port Driver 是一种机制,允许 Erlang 进程与外部 C 库或者其他语言编写的程序进行通信。Port Driver 提供了一种方式,使得 ...
阅读“erlang的timer和实现机制.pdf”文件以及“更多erlang资料下载.txt”中的其他资源,可以深入理解Erlang的timer模块以及其在实际项目中的应用,提升Erlang编程技能。对于Erlang初学者来说,了解并熟练掌握`timer...
在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...
CNode的主要功能包括创建Erlang进程,发送和接收消息,以及调用Erlang的函数。 **Erlang_CNode用户指南** Erlang_CNode用户指南通常会涵盖以下几个核心主题: 1. **安装和配置**:指导用户如何在系统上安装Erlang...
4. **分布式编程**:Erlang进程可以分布在多个节点上,实现分布式系统的构建。书可能讲解了如何进行节点间通信、分布式数据管理和负载均衡。 5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可...
Erlang作为一种专为构建可扩展、并发和分布式系统而设计的编程语言,其在进程间通信(IPC)领域的应用尤为广泛。Erlang脚本,即以.erl为扩展名的文件,允许用户编写和执行一系列Erlang命令,以实现进程间的通信和...
Erlang的并发模型是基于轻量级进程(也称为Erlang进程)的,它们之间的通信通过消息传递完成。这种方式降低了同步开销,提高了系统的并行性。每个进程都有自己的内存空间,减少了数据竞争的风险。当一个进程崩溃时,...
Erlang以其强大的错误恢复能力和轻量级进程(称为Erlang进程)而闻名,这些进程具有内置的并发性和容错性。 在安装Erlang 24.3.4.4之前,首先需要了解你的操作系统是否支持。Erlang支持多种平台,包括Windows、...
多处理,即在多核处理器上同时运行多个Erlang进程,是Erlang提供的又一并发编程模型。 Erlang的OTP框架是一组用于处理常见任务的库和中间件,它包括了用于应用管理和并发控制的工具。 事件处理机制使得Erlang应用...
源码分析可以帮助我们更深入地理解Erlang的内在机制和设计哲学。 Erlang是一种面向并发的、并行计算的语言,其主要设计目标是为了构建高可用、容错性强的实时系统。它的核心特点包括轻量级进程、消息传递、热代码...
1. **进程**:Erlang进程通过`spawn`函数创建,它们之间通过消息传递通信,如`send`和`receive`操作。 2. **链接与监控**:进程间可以建立链接,当一个进程崩溃时,链接的进程会收到通知。此外,还可以对进程进行...
2. **故障隔离**:Erlang进程之间通过异步消息传递通信,当一个进程崩溃时,不会影响其他进程,这种机制提供了天然的容错性。 3. **函数式编程**:Erlang强调纯函数,即没有副作用的函数,这使得代码更易于理解和...
3. **消息传递**:Erlang 进程间通过消息传递进行通信,这种方式是非阻塞的,提高了系统的响应速度和可扩展性。 4. **分布式编程**:Erlang 支持跨节点的分布式计算,可以轻松地构建大规模的分布式系统。 5. **热...
**外部接口**:Erlang进程与外部世界的交互也依赖于消息传递,这保持了一致性,简化了系统的复杂性。 **Fail-fast原则**:Erlang倾向于快速暴露错误,以便开发者能尽早发现问题并修复。 **面向并发的编程**:...
对于开发者而言,理解Erlang的源码可以帮助他们更好地利用这个平台,实现更高效、更健壮的应用程序。 在使用Erlang进行开发时,你可能需要用到以下工具和概念: - **Rebar3**:Erlang的构建和依赖管理工具,帮助你...