如果我创建一个文件loop.exs:
Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
Run Code Online (Sandbox Code Playgroud)
并运行它,计算输出行数:
elixir loop.exs | wc -l
Run Code Online (Sandbox Code Playgroud)
在随后的运行中,我可能会看到预期的40000行,但可能会看到更少的行。在我的测试中,我已经看到了39752,39934,39673等这表明,我认为某些进程没有得到调用IO.puts,那么什么是发生在他们身上,为什么没有我警告他们已经失踪了,和我是什么做错了导致这种情况发生?
问题是脚本在根级别对表达式进行计算后立即退出。由于生成过程是异步的,因此一旦完成第40,000个生成过程,Elixir就会退出。您所看到的行数是IO.puts在生成第40,000个进程之前完成执行的进程数。您可以通过:timer.sleep/1在末尾添加一个小调用来验证这一点:
Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
:timer.sleep(500)
Run Code Online (Sandbox Code Playgroud)
这样,我总是得到40k行的输出。(如果在生成最后IO.puts一个进程的500毫秒内未执行最后一个,则此数字会减少。)