Elixir 链接

2023-12-15 13:58 更新
Elixir中最常用的生成方式就是spawn_link/1.在我们展示spawn_link/1的例子之前,先看看当进程失败时会发生什么:
iex> spawn fn -> raise "oops" end
#PID<0.58.0>

[error] Process #PID<0.58.00> raised an exception
** (RuntimeError) oops
    :erlang.apply/2

仅仅是记录了错误,进程依然能够被生成.这是因为进程之间是独立的.如果我们希望一个进程的失败影响到其它进程,我们就需要链接它们.使用spawn_link/1:

iex> spawn_link fn -> raise "oops" end
#PID<0.41.0>

** (EXIT from #PID<0.41.0>) an exception was raised:
    ** (RuntimeError) oops
        :erlang.apply/2

当壳中发生了一个错误,壳会自动捕获这个错误并以良好的格式展示出来.为了理解我们的代码中究竟发生了什么,让我们在文件中来使用​spawn_link/1​并运行它:

# spawn.exs
spawn_link fn -> raise "oops" end

receive do
  :hello -> "let's wait until the process fails"
end
$ elixir spawn.exs

** (EXIT from #PID<0.47.0>) an exception was raised:
    ** (RuntimeError) oops
        spawn.exs:1: anonymous fn/0 in :elixir_compiler_0.__FILE__/1

这一次进程失败了并且关闭了它所链接的父进程.我们也可以通过调用Process.link/1来手工链接进程.我们建议你查看一下Process模块,其中有进程的其他功能.

进程和链接在创建可容错系统中扮演着重要角色.在Elixir应用中,我们经常将进程和管理者链接起来,管理者的作用是监督这块区域中进程的生死.进程间是独立的且默认不分享任何东西,所以它们不会毁坏或影响其它进程.

不同于其它语言要求我们捕捉/处理异常,在Elixir中我们可以任由进程失败,因为我们期望管理者能合适地重启我们的系统."快速失败"是编写Elixir软件时的一条守则.

spawn/1spawn_link/1是Elixir里用于创建进程的最原始的方法.尽管我们目前只用过它们,但大多数时候我们将抽象地在它们的上层操作.让我们来看看最常用的方式--任务.


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号