Elixir 進程和群首領(lǐng)

2023-12-15 14:20 更新
你可能已經(jīng)注意到了File.open/2返回了一個元組形如{:ok, pid}:
iex> {:ok, file} = File.open "hello", [:write]
{:ok, #PID<0.47.0>}

這是因為IO模塊正在處理進程(參見Elixir 進程).當(dāng)你運行IO.write(pid, binary)時,IO模塊將根據(jù)pid發(fā)送一個所需操作的信息給進程.讓我們來看看自己設(shè)定進程時會發(fā)生什么:

iex> pid = spawn fn ->
...>  receive do: (msg -> IO.inspect msg)
...> end
#PID<0.57.0>
iex> IO.write(pid, "hello")
{:io_request, #PID<0.41.0>, #Reference<0.0.8.91>, {:put_chars, :unicode, "hello"}}
** (ErlangError) erlang error: :terminated

IO.write/2之后,我們看到IO模塊發(fā)送了的請求(一個四元素元組)打印了出來.之后,我們看到它失敗了,原因是我們沒有提供IO模塊期待的某種結(jié)果.

StringIO模塊提供了IO設(shè)備信息中字符串的操作:

iex> {:ok, pid} = StringIO.open("hello")
{:ok, #PID<0.43.0>}
iex> IO.read(pid, 2)
"he"

通過用進程模型化了的IO設(shè)備,Erlang虛擬機允許同一個網(wǎng)絡(luò)中的不同節(jié)點可以交換文件進程,以此來在不同的節(jié)點間讀寫文件.在所有IO設(shè)備之中,有一個與眾不同的進程:群首領(lǐng).

當(dāng)你寫入到:stdio,你實際上是在發(fā)送一個信息給群首領(lǐng),它會寫入到標(biāo)準(zhǔn)輸出文件中:

iex> IO.puts :stdio, "hello"
hello
:ok
iex> IO.puts Process.group_leader, "hello"
hello
:ok

群首領(lǐng)可以由單個進程配置而成,并可用于不同的情形.例如,當(dāng)在遠(yuǎn)程終端中執(zhí)行代碼時,它可以保證在遠(yuǎn)程節(jié)點中的信息被重定向并打印在觸發(fā)請求的終端中.

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號