2014-04-09 10 views

Odpowiedz

15

Istnieje kilka drobnych różnic:

  • Oczywiście gen_server klamki odlewane w handle_cast i „normalne” wiadomości w handle_info.
  • Gips nigdy nie zawodzi; zawsze zwraca ok. Wysyłanie wiadomości z ! kończy się niepowodzeniem z badarg, 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 dla gen_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.

4

Oprócz posta legoscia powiedziałbym, że łatwiej jest wyśledzić dedykowaną funkcję API niż wiadomości. Zwłaszcza w środowisku prod.

Powiązane problemy