Ich glaube, ich habe irgendwo gelesen, dass es einen Unterschied zwischen spawn/1
und spawn/3
gibt, wenn es um heißes Nachladen geht, aber ich kann keine vollständigen Informationen zu diesem Thema finden. Also frage ich mich, ob es tatsächlich einen Unterschied gibt und wenn ja, was ist es dann? Ein Beispiel wäre großartig. Vielen Dank.Unterschied zwischen spawn/1 und spawn/3
Antwort
Der Unterschied zwischen den beiden ist, dass spawn/1
einen lokalen Funktionsaufruf macht, während spawn/3
einen "voll qualifizierten" Funktionsaufruf macht.
Wenn Sie eine neue Version eines Moduls laden, bleibt die alte Version erhalten, und jeder Prozess, der in der alten Version ausgeführt wurde, macht dies weiterhin. Die Ausnahme ist, wenn der Prozess einen "vollqualifizierten" Funktionsaufruf ausführt, einschließlich des Modulnamens: In diesem Fall wird immer die neueste Version des Codes verwendet.
Zum Beispiel mit diesem Modul:
defmodule Foo do
def start_loop do
spawn(fn -> loop end)
end
def loop do
receive do
:foo ->
spawn &print_foo/0
loop
:reload ->
Foo.loop
end
end
def print_foo do
IO.puts "foo 1"
end
end
wir einen Prozess starten kann, und jedes Mal, wenn wir :foo
, um es zu senden, laicht es einen weiteren Prozess, der foo 1
druckt:
iex(1)> c("foo.ex")
[Foo]
iex(2)> p = Foo.start_loop
#PID<0.68.0>
iex(3)> send p, :foo
foo 1
:foo
iex(4)> send p, :foo
foo 1
:foo
Jetzt, Wenn wir das Modul so modifizieren, dass es stattdessen foo 2
druckt, neu kompiliert und neu lädt, gibt es keine sofortige Änderung:
iex(5)> c("foo.ex")
warning: redefining module Foo (current version loaded from Elixir.Foo.beam)
foo.ex:1
[Foo]
iex(6)> send p, :foo
foo 1
:foo
Nur wenn wir sagen, um den Prozess zu „Neu laden“, um einen vollständig qualifizierten Aufruf an das Modul zu machen, haben wir die neue Version erhalten:
iex(7)> send p, :reload
:reload
iex(8)> send p, :foo
foo 2
:foo
Natürlich, wenn Sie spawn/1
verwenden mit eine Funktion, die nur einen voll qualifizierten Anruf macht, der Unterschied verschwindet:
spawn(fn -> Foo.print_foo end)
- 1. Unterschied zwischen Vorzeichen & und *?
- 2. VBA: Unterschied zwischen & und +
- 3. Unterschied zwischen "**/* /" und "** /"?
- 4. Unterschied zwischen $ # und $ {# @}
- 5. Unterschied zwischen = und: =
- 6. Unterschied zwischen {!! !!} und {{}}
- 7. Unterschied zwischen '#', '%' und '$'
- 8. MySQL: Unterschied zwischen ', `,' und '
- 9. C++ Unterschied zwischen '//' und '///'
- 10. Unterschied zwischen String.Empty und ""
- 11. Unterschied zwischen „und"
- 12. Unterschied zwischen `% in%` und `==`
- 13. Unterschied zwischen numpy.logical_and und &
- 14. Unterschied zwischen. und #
- 15. Unterschied zwischen // und http: //
- 16. Unterschied zwischen -Wconversion zwischen gcc und g ++
- 17. Unterschied zwischen Wörterbuch und Hashtable
- 18. Unterschied zwischen FetchMode und FetchType
- 19. Unterschied zwischen Application_Start und Application_OnStart
- 20. Unterschied zwischen Uint8Array und Uint8ClampedArray
- 21. Unterschied zwischen BOOST_CHECK_CLOSE und BOOST_CHECK_CLOSE_FRACTION?
- 22. Unterschied zwischen Suche und Index
- 23. Unterschied zwischen AJAX und Senden
- 24. Unterschied zwischen Spekulation und Vorhersage
- 25. Unterschied zwischen inproc und outproc
- 26. Unterschied zwischen Clojure und Clojurescript?
- 27. Unterschied zwischen NSArray und NSMutableArray
- 28. Unterschied zwischen libcurl und libsoup
- 29. Unterschied zwischen DirectoryCatalog und AssemblyCatalog
- 30. Unterschied zwischen * y ++ und ++ * y?
Ich könnte nicht für eine bessere Erklärung bitten, danke. – JustMichael