2016-10-28 4 views
0

Wenn ich eine Datei loop.exs erstellen:Elixir "Losing" Prozesse

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

und führen Sie es, die Linien der Ausgangs zählen:

elixir loop.exs | wc -l 

Und auf den folgenden Durchläufen kann ich die erwartete sehen 40000 Linien, aber ich könnte weniger sehen. In meinen Tests habe ich 39752, 39934, 39673 usw. gesehen. Dies deutet darauf hin, dass bestimmte Prozesse nicht IO.puts aufrufen, also was passiert mit ihnen, warum bin ich nicht gewarnt, dass sie verschwunden sind, und was mache ich falsch, dass dies geschieht?

Antwort

4

Das Problem besteht darin, dass das Skript beendet wird, sobald die Ausdrücke auf der Stammebene ausgewertet wurden. Da der Laichprozess asynchron ist, beendet Elixir, sobald es fertig ist, den 40.000sten Prozess. Die Anzahl der angezeigten Zeilen entspricht der Anzahl der Prozesse, die IO.puts ausgeführt haben, bevor der 40.000ste Prozess gestartet wurde. Sie können dies überprüfen, indem Sie ein wenig :timer.sleep/1 Anruf am Ende hinzufügen:

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

Damit habe ich immer 40k Zeilen der Ausgabe. (Diese Nummer ist weniger, wenn die letzte IO.puts nicht innerhalb von 500 Millisekunden nach dem letzten Prozess ausgeführt wird.)

+0

@ Fuser97381 Dies ist die vollkommen gültige Antwort und Sie könnten Ihre Avatar-Präferenzen mit Ihren Mitbewohnern diskutieren. Hier auf SO sind Sie verpflichtet, die Frage als richtig zu markieren, sobald sie richtig ist. Ich habe Ihren Kommentar für die Aufmerksamkeit der Moderatoren markiert. – mudasobwa