Я считаю, что я где-то читал, что есть разница между использованием spawn/1
и spawn/3
, когда дело доходит до горячей перезагрузки, но я не могу найти полную информацию по этому вопросу. Поэтому я задаюсь вопросом, есть ли на самом деле разница, и если да, то что это? Какой-то пример будет замечательным. Спасибо.Разница между spawn/1 и spawn/3
ответ
Разница между двумя заключается в том, что spawn/1
выполняет локальный вызов функции, а spawn/3
выполняет «полноценный» вызов функции.
Когда вы загружаете новую версию модуля, старая версия все еще хранится, и любой процесс, который выполнялся в старой версии, продолжает это делать. Исключением является то, что процесс выполняет «полный» вызов функции, включая имя модуля: в этом случае всегда используется самая новая версия кода.
Например, с этим модулем:
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
мы можем начать процесс, и каждый раз, когда мы посылаем :foo
к нему, то он запускает другой процесс, который печатает foo 1
:
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
Теперь, если мы модифицируем модуль для печати foo 2
, а затем перекомпилируем и перезагрузим его, немедленное изменение:
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
Только тогда, когда мы говорим процесс «перезагрузки», сделав полное вызов модуля, мы получаем новую версию:
iex(7)> send p, :reload
:reload
iex(8)> send p, :foo
foo 2
:foo
Конечно, если вы используете spawn/1
с функция, которая только делает полный вызов, разница исчезает:
spawn(fn -> Foo.print_foo end)
- 1. Разница между композитором.phar между | и ||
- 2. Разница между ~/и ../
- 3. разница между $ и $$
- 4. разница между & и * Декларация
- 5. Разница между% и/
- 6. Разница между jquery и $
- 7. разница между -> и ::
- 8. Разница между. и ==
- 9. разница между Scala «+:» и «::»
- 10. Grails: Разница между \ $ {} и $ {}
- 11. Разница между! и ~
- 12. разница между (*) [] и * [] декларации
- 13. Разница между == и .equals()?
- 14. Разница между fmod и%
- 15. Разница между === и ==
- 16. Разница между комментариями/* */и/** * /?
- 17. Разница между ./ и ~/
- 18. Разница между: = и not (=)
- 19. разница между «/» и Слим
- 20. разница между 'есть' и '=='
- 21. Разница между «источником» и «.»
- 22. разница между `% в%` и `` ==
- 23. OCaml разница между :: и @
- 24. разница между $ @ и $ *
- 25. разница между! = И! ==
- 26. htaccess - Разница между. * И \ *
- 27. разница Javascript между «=» и «===»
- 28. Разница между «+» и «~»
- 29. какая разница между @ и @ :?
- 30. Разница между || и || =?
Я не мог попросить лучшего объяснения, спасибо. – JustMichael