Erlang Process

Process
Erlang 设计用于高并发。Erlang 进程是轻量级进程,支持内存伸缩的低内存映射,快速创建、终止和调度都是很低的切换。

Process Creation
创建一个进程通过调用 spawnI(), 例如:
    spawn(Module, Name, Args) -> pid()
        Module = Name = atom()
        Args = [Arg1, ...., ArgN]
        ArgI = term()

spawn 创建一个新进程并返回一个进程Id。

新的进程启动后,调用 Module:Name(Arg1, Arg2, ...., ArgN)
当然,Erlang不仅仅提供了,这一种BIFs,例如 : spawn/4 用于在其他节点创建进程

Registered Process
除了通过 p id() 的方式访问来识别一个进程外,Erlang 还提供了 其他的BIFs 用于为一个命名。这个名字必须是一个原子,如果进程退出,那么这个名字将自动回收,BIFs 如下:

Process Termination
在Erlang中,一个进程的结束,总是有退出原因的。这个原因可以是任意的原子
如果退出原因是原子 normal,那么进程通常提示终止。一个进程没有代码执行通常终止。
进程可以通过调用BIFs终止自己
exit(Reason)
erlang:error(Reason) ,
erlang:error(Reason, Args) ,
erlang:fault(Reason),  
erlang:fault(Reason, Args)

如果进程收到退出信号的原因不是 normal ,那么进程也可能被终止。参看 : Error Handling below.

Message Sending
进程的交互通过发送和接收消息。发送消息通过 : ! ,接收通过调用 : receive.
发送消息是异步安全的,假如接收者存在的情况下,能够确保消息最终到达接受者

Links
两个进程之间可以建立一个相互的连接。例如:
在 Pid1 和 Pid2 之间有一个连接,这个连接是由Pid1通过调用 BIF link(Pid2) 或者也是一样。同样,Erlang 提供了不只是一个BIFs。其中,spawn_link() BIF 操作是 spawn 和 link 合并为一个动作。连接是双向的,并且仅仅是建立两个进程之间的连接。重复调用 link(pid) 没有意义,只有第一次起作用
连接可以通过调用 BIF unlink(Pid) 删除连接。
连接可以用于监控另外一个进程的行为,参看 Error Handling below。

Error Handling
Erlang 针对进程间的错误处理,提供了一套内建的特征。终止的进程将发出退出信号到所有连接的进程,收到信号的进程可能终止或者捕获退出信号做出处理。这一个特征常用于建立 分层编程结构,一些进程监督其他进程,例如:如果进程异常退出,重启他们。
结合OTP设计原理,在监督树的实现部分,就应用了这一特征。

Emitting Exit SIgnals
当进程终止时,他将产生一个退出原因,用于解释进程终止之前的状态。退出原因通过信号的方式发送到所有与退出进程连接的进程。
进程也可以调用函数 exit(Pid, Reason). 这样将退出信号发送至 Pid 进程,不会影响调用者。

Receiving Exit Signals
当一个进程受到一个退出信号,且退出原因不是 normal 时, 默认行为是终止并且发送携带相同原因的退出信号到与其连接的进程。如果是 normal 默认是忽略。

A process can be set to trap exit signals by calling:

process_flag(trap_exit, true)

When a process is trapping exits, it will not terminate when an exit signal is received. Instead, the signal is transformed into a message {'EXIT',FromPid,Reason} which is put into the mailbox of the process just like a regular message.

An exception to the above is if the exit reason is kill, that is if exit(Pid,kill) has been called. This will unconditionally terminate the process, regardless of if it is trapping exit signals or not.


Monitors

An alternative to links are monitors. A process Pid1 can create a monitor for Pid2 by calling the BIF erlang:monitor(process, Pid2). The function returns a reference Ref.

If Pid2 terminates with exit reason Reason, a 'DOWN' message is sent to Pid1:

{'DOWN', Ref, process, Pid2, Reason}

If Pid2 does not exist, the 'DOWN' message is sent immediately with Reason set to noproc.

Monitors are unidirectional. Repeated calls to erlang:monitor(process, Pid) will create several, independent monitors and each one will send a 'DOWN' message when Pid terminates.

A monitor can be removed by calling erlang:demonitor(Ref).

It is possible to create monitors for processes with registered names, also at other nodes.



Process Dictionary
每一个进程都有他自己的词典,访问都是通过调用BIFs操作:
put(Key, Value)
get(Key)
get()
get_keys(Value)
earse(Key)
earse()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值