Pracowałem przez jakiś problem i zauważyłem kod, w którym poprzedni programista przekazywał wiadomości używając standardowej konwencji PID! Wiadomość. Używam gen_server: cast/2. Zastanawiałem się, czy ktoś może mi wyjaśnić istotne różnice i rozważania przy wyborze między tymi dwoma?Erlang: różnica między używaniem pliku gen_server: cast/2 a standardową wiadomością przekazującą
Odpowiedz
Istnieje kilka drobnych różnic:
- Oczywiście gen_server klamki odlewane w
handle_cast
i „normalne” wiadomości whandle_info
. - Gips nigdy nie zawodzi; zawsze zwraca
ok
. Wysyłanie wiadomości z!
kończy się niepowodzeniem zbadarg
, jeśli wysyłasz wiadomość do atomu, który nie jest aktualnie zarejestrowany przez proces. (Wysłanie komunikatu do pid nigdy nie powoduje błędu, nawet jeśli proces jest martwy.) - Jeśli serwer gen_server działa na węźle zdalnym, który nie jest aktualnie podłączony do węzła lokalnego, wówczas
gen_server:cast
spowoduje odrodzenie procesu w tle do nawiąż połączenie i wyślij wiadomość, a natychmiast wróć, a!
zwróci dopiero po ustanowieniu połączenia. (Zobacz kod dlagen_server:do_send
.)
Co do tego, kiedy wybrać jeden lub drugi, to głównie kwestia gustu. Powiedziałbym, że jeśli wiadomość mogłaby być uważana za asynchroniczną funkcję API dla serwera gen_, to powinna używać rzutowania, i mieć określoną funkcję API w module wywołania zwrotnego gen_server. Oznacza to, że zamiast nazywać gen_server:cast
bezpośrednio, jak to:
gen_server:cast(foo_proc, {some_message, 42})
nawiązać połączenie funkcję:
foo_proc:some_message(42)
i realizować taką funkcję jak bezpośredniej obsadzie powyżej. To hermetyzuje określony protokół z serwera_generacji w swoim własnym module.
Moim zdaniem, "zwykłe" wiadomości byłyby używane do zdarzeń, w przeciwieństwie do wywołań API. Przykładem mogą być komunikaty monitorujące, {'DOWN', Ref, process, Id, Reason}
oraz zdarzenia podobnego rodzaju, które mogą wystąpić w twoim systemie.
Oprócz posta legoscia powiedziałbym, że łatwiej jest wyśledzić dedykowaną funkcję API niż wiadomości. Zwłaszcza w środowisku prod.
- 1. Różnica między "używaniem" a określaniem zakresu?
- 2. Różnica między używaniem UINavigationController a UINavigationBar
- 3. jaka jest różnica między gen_server: obsada do gen_server: abcast
- 4. Różnica między biblioteką standardową C a biblioteką C POSIX
- 5. Różnica między używaniem metody getConnection() a używaniem puli bezpośrednio w pliku node.js z modułem node-mysql?
- 6. Jaka jest różnica między używaniem aplikacji/csv a tekstem/csv?
- 7. Jaka jest różnica między używaniem IEqualityComparer a korektą Equals/GethashCode?
- 8. Jaka jest różnica między używaniem obiektu instantiateViewControllerWithIdentifier a wykonywaniem identyfikatora?
- 9. Szablon Metaprogramming - Różnica między używaniem Enuma Hack a statycznym Const
- 10. Różnica w typie między używaniem a niewykorzystywaniem Ustaw słowo kluczowe
- 11. Jaka jest różnica między używaniem puli wątków a normalnym wątkiem?
- 12. Różnica między używaniem "chmod a + x" i "chmod 755"
- 13. Różnica między używaniem nazwy pliku; i użyj nazwy Modulename();
- 14. Jaka jest różnica między używaniem Docker Machine a Swarm i używaniem Swarm przez demona Docker?
- 15. Różnica między używaniem Trace i TraceSource
- 16. Jakie są różnice między typedef a używaniem?
- 17. Erlang erl_call powoduje, że moduł gen_server jest zamykany
- 18. Różnica między onbeforeunload a onunload
- 19. Różnica między czasem() a nową MongoDate()?
- 20. Jak zdecydujesz między używaniem abstrakcyjnej klasy a interfejsem?
- 21. Różnica między obiektem a *?
- 22. Różnica między jquery a $
- 23. Różnica między przecinkiem a złączeniem w sql
- 24. Kiedy używać serwera gen_server w aplikacjach Erlang/OTP
- 25. Różnica między UIWindow a UIView
- 26. Różnica między WebHooks ASP.NET a usługami sieciowymi?
- 27. różnica między __u8 a uint8_t
- 28. Różnica między File.Copy a File.Move
- 29. Jak sparametryzować moduł gen_server?
- 30. Różnica między String [] a i String ... a