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中工作正常。但这种组合没有产生任何结果。
为什么会这样?
答案 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
,并且在您退出之前它一直处于活动状态