Elixir send和receive

2023-12-15 13:58 更新
我们可以用send/2发送信息给进程,并用receiver/1接收:
iex> send self(), {:hello, "world"}
{:hello, "world"}
iex> receive do
...>   {:hello, msg} -> msg
...>   {:world, msg} -> "won't match"
...> end
"world"

当一个信息传送至进程,它被存放在进程的邮箱中.receive/1块会进入当前进程的邮箱,搜索是否有能模式匹配成功的信息.receive/1支持卫语句和多从句,例如case/2.

如果邮箱中没有能够匹配任何模式的信息,当前进程会一直等到能够匹配的信息出现.等待时间也可以被指定:

iex> receive do
...>   {:hello, msg}  -> msg
...> after
...>   1_000 -> "nothing after 1s"
...> end
"nothing after 1s"

如果你想要的是已经在邮箱中的信息,可以将时限设置为0.

让我们使用这些来在进程间通信:

iex> parent = self()
#PID<0.41.0>
iex> spawn fn -> send(parent, {:hello, self()}) end
#PID<0.48.0>
iex> receive do
...>   {:hello, pid} -> "Got hello from #{inspect pid}"
...> end
"Got hello from #PID<0.48.0>"

当在用户界面中时,你会发现​flush/0​助手非常有用.它会刷新并打印邮箱中的所有信息.

iex> send self(), :hello
:hello
iex> flush()
:hello
:ok


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

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号