为什么IO.puts不能用于Enum.each中的生成?

时间:2015-09-03 01:27:35

标签: elixir

Enum.each(1..100, fn(i)-> 
  spawn(fn-> IO.puts(i) end)
end)

spawn(fn-> IO.puts("HELLO") end)

我希望第一部分输出1到100到屏幕,但它什么也没做。如果我不使用spawn,只在第二行说IO.puts(i),它就可以了 - 所以IO.puts在each调用中运行正常。并且HELLO部分工作正常,因此IO.puts在一个spawn中工作正常。但这种组合没有产生任何结果。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

注意: 如果将代码保存在.exs文件中并使用{{1}在命令行运行,则可以重现此问题}

  

spawn/1接受一个将在另一个进程中执行的函数。

生成的进程将执行给定的函数并在函数完成后退出

在您的情况下,运行代码的父进程在生成的进程完成执行之前终止。

如果我们添加睡眠,那么,我们将看到输出:

elixit <file-name>.exs

Enum.each(1..100, fn(i)-> spawn(fn-> IO.puts(i) end) end) spawn(fn-> IO.puts("HELLO") end) :timer.sleep(1000) 中,您不会看到此问题,因为在这种情况下,运行iex ed进程的父进程本身就是spawn,并且在您退出之前它一直处于活动状态