Cha*_*lie 3 concurrency erlang functional-programming elixir erlang-otp
写一些小实验来熟悉语言,但遇到了一个我猜的问题是基本问题.
我有一个简单的主管,有3个简单的工人:
def init do
Supervisor.start_link(
[
worker(__MODULE__, [:"process-1"], [function: :test, id: :"p-1"]),
worker(__MODULE__, [:"process-2"], [function: :test, id: :"p-2"]),
worker(__MODULE__, [:"process-3"], [function: :test, id: :"p-3"])
],
strategy: :one_for_one
)
end
Run Code Online (Sandbox Code Playgroud)
":test"看起来像这样:
def test(name) do
flag(:trap_exit, true)
IO.puts "Testing: #{name} == #{inspect self}"
register(self, name)
receive do
{ :death } ->
IO.puts("I WOZ MURDERED!")
exit(self, "Ex process...")
{ :life } ->
IO.puts("#{inspect self} is listening...")
__MODULE__.test(name)
{ :EXIT, pid, reason } ->
IO.puts "REASON: #{inspect reason} - PROCESS: #{inspect pid}"
end
end
Run Code Online (Sandbox Code Playgroud)
这个编译,但它只产生一个进程,并挂起/阻止iex.
相反,当我使用一个简单的'spawn_link'ed'进程链时,所有三个(或多个)进程同时启动并将控制权返回给iex shell,这样我就可以从命令行发送已注册的进程消息.
我现在的目的是创建一个OTP主管,运行并注册三个(或多个)工作进程并将它们附加到主管,发送一条简单的消息来杀死一个给定的工作者,然后让主管重新启动它.
我究竟做错了什么?
问题是function:你作为工作者规范的一部分给出的不是OTP所期望的.
来自http://www.erlang.org/doc/man/supervisor.html
start函数必须创建并链接到子进程,并且应该返回{ok,Child}或{ok,Child,Info},其中Child是子进程的pid,Info是一个被主管忽略的任意术语.
您的代码不会生成子代,但会进入接收循环.您也许可以使用Elixir的Task模块执行类似于您想要的操作:
worker(Task, [__MODULE__, :test, [:"process-1"]], id: :"p-1"),
worker(Task, [__MODULE__, :test, [:"process-2"]], id: :"p-2"),
worker(Task, [__MODULE__, :test, [:"process-3"]], id: :"p-3")
Run Code Online (Sandbox Code Playgroud)
但是,如果您希望了解有关OTP的更多信息,那么实施自己的OTP GenServer可能是更好的选择.
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |