【发布时间】:2019-01-30 18:10:18
【问题描述】:
目前我有这样的事情:
ref = Process.monitor(worker)
receive do
{:DOWN, ^ref, :process, ^worker, :normal} ->
IO.puts("Normal exit from #{inspect(worker)}")
{:DOWN, ^ref, :process, ^worker, msg} ->
IO.puts("Received :DOWN from #{inspect(worker)}")
end
那个工人有一个 start_link 它将数据流发送到消费者,所有这一切都发生在一个混合任务中,所以如果我不添加接收,一旦混合死亡,它也会杀死子进程,同样就像我从 iex -S mix shell 运行它一样。
flow
... some producer consumer in the middle
|> Flow.into_specs(consumer)
问题是,当流为空时(是一个有限流),worker 似乎没有死,接收不会被触发,还有其他方法可以实现吗?
编辑:
用我什至不需要receive do的虚拟进程进行测试
defmodule Mix.Tasks.Stuff do
def run([]) do
{:ok, worker} = Worker.start_link([])
end
end
defmodule Worker do
def start_link([]) do
Enum.map([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], fn number ->
IO.puts "COUNTING"
Process.sleep(1000)
IO.puts "-----------"
end)
end
end
但是当工作人员启动 Flow 时,如果我不等待 receive do,它会在我执行任务时立即死亡,所以也许这就是问题所在。
【问题讨论】:
-
当流为空时,它应该立即返回,比您的进程转到
receive更快。请问|> IO.inspectProcess.monitor(worker)返回什么? -
ref 只是一个 pid
-
worker是这样启动的; {:ok, worker} = Worker.start_link([]) 然后 ref = Process.monitor(worker)
标签: elixir