Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir “长生不老药”;“失去”;过程_Elixir - Fatal编程技术网

Elixir “长生不老药”;“失去”;过程

Elixir “长生不老药”;“失去”;过程,elixir,Elixir,如果我创建一个文件loop.exs: Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end) 然后运行它,计算输出行数: elixir loop.exs | wc -l 在随后的运行中,我可能会看到预期的40000行,但我可能会看到更少的行。在我的测试中,我看到了39752,39934,39673,等等。这对我来说意味着某些进程无法调用IO.puts,所以它们发生了什么,为什么我没有警告它们丢失了,我做错了什么导

如果我创建一个文件
loop.exs

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
然后运行它,计算输出行数:

elixir loop.exs | wc -l

在随后的运行中,我可能会看到预期的
40000行,但我可能会看到更少的行。在我的测试中,我看到了
39752
39934
39673
,等等。这对我来说意味着某些进程无法调用
IO.puts
,所以它们发生了什么,为什么我没有警告它们丢失了,我做错了什么导致了这种情况的发生?

问题是,脚本在根级别计算完表达式后立即退出。由于生成过程是异步的,Elixir在生成第40000个过程后立即退出。您看到的行数是在生成第40000个进程之前完成执行的进程数。您可以通过在末尾添加一个小的
:timer.sleep/1
调用来验证这一点:

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
:timer.sleep(500)

有了这个,我总能得到4万行输出。(如果在生成最后一个进程的500毫秒内未执行最后一个
IO.puts
,则此数字将减少。)

问题在于,脚本在根级别计算完表达式后立即退出。由于生成过程是异步的,Elixir在生成第40000个过程后立即退出。您看到的行数是在生成第40000个进程之前完成执行的进程数。您可以通过在末尾添加一个小的
:timer.sleep/1
调用来验证这一点:

Enum.each(1..40000, fn (n) -> spawn fn -> IO.puts(n) end end)
:timer.sleep(500)

有了这个,我总能得到4万行输出。(如果在生成最后一个进程的500毫秒内没有执行最后一个
IO.puts
,则该数字将减少。)

@Fuser97381这是完全正确的答案,您可以与室友讨论您的化身偏好。因此,您必须在问题正确后立即将其标记为正确。我标记了你的评论以引起版主的注意。@Fuser97381这是完全正确的答案,你可以与室友讨论你的头像偏好。因此,您必须在问题正确后立即将其标记为正确。我标记了你的评论以引起版主的注意。