W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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)程依然能夠被生成.這是因為進(jìn)程之間是獨立的.如果我們希望一個進(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
?并運行它:
# 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)程間是獨立的且默認(rèn)不分享任何東西,所以它們不會毀壞或影響其它進(jìn)程.
不同于其它語言要求我們捕捉/處理異常,在Elixir中我們可以任由進(jìn)程失敗,因為我們期望管理者能合適地重啟我們的系統(tǒng)."快速失敗"是編寫Elixir軟件時的一條守則.
spawn/1
和spawn_link/1
是Elixir里用于創(chuàng)建進(jìn)程的最原始的方法.盡管我們目前只用過它們,但大多數(shù)時候我們將抽象地在它們的上層操作.讓我們來看看最常用的方式--任務(wù).
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: