Elixir 进程和群首领

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

这是因为IO模块正在处理进程(参见Elixir 进程).当你运行IO.write(pid, binary)时,IO模块将根据pid发送一个所需操作的信息给进程.让我们来看看自己设定进程时会发生什么:

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模块发送了的请求(一个四元素元组)打印了出来.之后,我们看到它失败了,原因是我们没有提供IO模块期待的某种结果.

StringIO模块提供了IO设备信息中字符串的操作:

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

通过用进程模型化了的IO设备,Erlang虚拟机允许同一个网络中的不同节点可以交换文件进程,以此来在不同的节点间读写文件.在所有IO设备之中,有一个与众不同的进程:群首领.

当你写入到:stdio,你实际上是在发送一个信息给群首领,它会写入到标准输出文件中:

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

群首领可以由单个进程配置而成,并可用于不同的情形.例如,当在远程终端中执行代码时,它可以保证在远程节点中的信息被重定向并打印在触发请求的终端中.

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

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号