Elixir 鏈接

2023-12-15 13:58 更新
Elixir中最常用的生成方式就是spawn_link/1.在我們展示spawn_link/1的例子之前,先看看當(dāng)進(jìn)程失敗時會發(fā)生什么:
iex> spawn fn -> raise "oops" end
#PID<0.58.0>

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

僅僅是記錄了錯誤,進(jìn)程依然能夠被生成.這是因?yàn)檫M(jìn)程之間是獨(dú)立的.如果我們希望一個進(jìn)程的失敗影響到其它進(jìn)程,我們就需要鏈接它們.使用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

當(dāng)殼中發(fā)生了一個錯誤,殼會自動捕獲這個錯誤并以良好的格式展示出來.為了理解我們的代碼中究竟發(fā)生了什么,讓我們在文件中來使用?spawn_link/1?并運(yùn)行它:

# 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

這一次進(jìn)程失敗了并且關(guān)閉了它所鏈接的父進(jìn)程.我們也可以通過調(diào)用Process.link/1來手工鏈接進(jìn)程.我們建議你查看一下Process模塊,其中有進(jìn)程的其他功能.

進(jìn)程和鏈接在創(chuàng)建可容錯系統(tǒng)中扮演著重要角色.在Elixir應(yīng)用中,我們經(jīng)常將進(jìn)程和管理者鏈接起來,管理者的作用是監(jiān)督這塊區(qū)域中進(jìn)程的生死.進(jìn)程間是獨(dú)立的且默認(rèn)不分享任何東西,所以它們不會毀壞或影響其它進(jìn)程.

不同于其它語言要求我們捕捉/處理異常,在Elixir中我們可以任由進(jìn)程失敗,因?yàn)槲覀兤谕芾碚吣芎线m地重啟我們的系統(tǒng)."快速失敗"是編寫Elixir軟件時的一條守則.

spawn/1spawn_link/1是Elixir里用于創(chuàng)建進(jìn)程的最原始的方法.盡管我們目前只用過它們,但大多數(shù)時候我們將抽象地在它們的上層操作.讓我們來看看最常用的方式--任務(wù).


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號