Elixir 为什么';IO.PUT将繁殖的工作放入枚举中。每个?
我希望第一部分输出1-100到屏幕,但它什么也不做。如果我不使用Elixir 为什么';IO.PUT将繁殖的工作放入枚举中。每个?,elixir,Elixir,我希望第一部分输出1-100到屏幕,但它什么也不做。如果我不使用spawn,只在第二行说IO.puts(I),它工作得很好——因此在每次调用中,IO.puts都工作得很好。HELLO部分工作正常,因此IO.put在一个spawn中工作正常。但这两者的结合不会产生任何效果 这是为什么?注意:如果您将代码保存在.exs文件中,并使用elixit.exs在命令行上运行,则可能会重现此问题 接受它将在另一个进程中执行的函数 派生的进程将执行给定的函数,并在函数完成后退出 在您的情况下,运行代码的父进程
spawn
,只在第二行说IO.puts(I)
,它工作得很好——因此在每次调用中,IO.puts都工作得很好。HELLO部分工作正常,因此IO.put在一个spawn中工作正常。但这两者的结合不会产生任何效果
这是为什么?注意:如果您将代码保存在.exs
文件中,并使用elixit.exs在命令行上运行,则可能会重现此问题
接受它将在另一个进程中执行的函数
派生的进程将执行给定的函数,并在函数完成后退出
在您的情况下,运行代码的父进程在生成的进程完成其执行之前终止
如果我们添加睡眠,那么我们将看到输出:
Enum.each(1..100, fn(i)->
spawn(fn-> IO.puts(i) end)
end)
spawn(fn-> IO.puts("HELLO") end)
您将不会在iex中看到此问题,因为在这种情况下,运行spawn
ed进程的父进程本身就是iex
,在您退出之前它一直处于活动状态。我在iex中试用了您的代码,它对这两个示例都有效。我可以确认@Gjaldon说的话。我使用Ctrl-B选项从升华文本运行。exs
,它的行为与OP说的一样。另外,如果我使用elixir test.exs,那么OP报告的问题也会发生
Enum.each(1..100, fn(i)->
spawn(fn-> IO.puts(i) end)
end)
spawn(fn-> IO.puts("HELLO") end)
:timer.sleep(1000)