长生不老药的“丢失”过程

Dar*_*ous 0 elixir

如果我创建一个文件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行,但可能会看到更少的行。在我的测试中,我已经看到了397523993439673等这表明,我认为某些进程没有得到调用IO.puts,那么什么是发生在他们身上,为什么没有我警告他们已经失踪了,和我是什么做错了导致这种情况发生?

Dog*_*ert 5

问题是脚本在根级别对表达式进行计算后立即退出。由于生成过程是异步的,因此一旦完成第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毫秒内未执行最后一个,则此数字会减少。)