如果我创建文件loop.exs
:
Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
运行它,计算输出线:
elixir loop.exs | wc -l
在随后的运行中,我可能会看到预期的40000
行,但我可能会看到更少。在我的测试中,我看过39752
,39934
,39673
等。这告诉我,某些流程无法调用IO.puts
那么他们发生了什么,为什么我没有警告他们已经失踪了,我做错了是什么让这种情况发生呢?
答案 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
,则此数字会更少。)