codecamp

Elixir 链接

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里用于创建进程的最原始的方法.尽管我们目前只用过它们,但大多数时候我们将抽象地在它们的上层操作.让我们来看看最常用的方式--任务.


Elixir 任务
Elixir 状态
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Elixir 基本操作符

Elixir 二进制,字符串和字符列表

Elixir 类型规格与行为

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }