2016-10-28 3 views
0

Если я создаю файл 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, так что с ними происходит, почему я не предупредил, что они пропали без вести, и что я делаю неправильно, чтобы это произошло?

ответ

4

Проблема заключается в том, что скрипт завершается, как только это делается, оценивая выражения на корневом уровне. Поскольку нерестовые процессы являются асинхронными, Elixir уходит, как только это происходит, порождает 40 000-й процесс. Количество строк, которые вы видите, - это количество процессов, которые завершили выполнение IO.puts до того, как 40 000-й процесс был порожден. Вы можете проверить это, добавив немного :timer.sleep/1 вызов в конце:

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

С этим, я всегда получаю 40K строк вывода. (Это число будет меньше, если последний IO.puts не будет выполнен в течение 500 миллисекунд от последнего процесса, который был порожден.)

+0

@ Fuser97381 Это абсолютно правильный ответ, и вы можете обсудить свои настройки аватара со своими соседями по комнате. Здесь, на SO, вы обязаны правильно поставить вопрос, как только это будет правильно. Я отметил ваш комментарий для внимания модераторов. – mudasobwa

Смежные вопросы