Elixir"失去"流程

时间:2016-10-28 18:21:37

标签: elixir

如果我创建文件loop.exs

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)

运行它,计算输出线:

elixir loop.exs | wc -l

在随后的运行中,我可能会看到预期的40000行,但我可能会看到更少。在我的测试中,我看过397523993439673等。这告诉我,某些流程无法调用IO.puts那么他们发生了什么,为什么我没有警告他们已经失踪了,我做错了是什么让这种情况发生呢?

1 个答案:

答案 0 :(得分:4)

问题是,一旦完成在根级别评估表达式,脚本就会退出。由于产卵过程是异步的,Elixir一旦产生第40,000个过程就会退出。您看到的行数是在生成第40,000个进程之前完成执行IO.puts的进程数。您可以通过在结尾添加一点:timer.sleep/1来验证这一点:

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
:timer.sleep(500)

有了这个,我总是得到40k输出线。 (如果在生成的最后一个进程的500毫秒内没有执行最后IO.puts,则此数字会更少。)