2014-04-09 12 views

cevap

15

birkaç küçük farklılıklar vardır:

  • Açıkçası, gen_server handle_info yılında handle_cast yılında atmalarını ve "normal" mesajları yönetir.
  • Döküm asla başarısız olmaz; her zaman ok değerini döndürür. ! ile ileti gönderme işlemi, şu anda bir işlem tarafından kaydedilmemiş bir atoma ileti gönderiyorsanız, badarg ile başarısız olur. (Bir pid'e ileti göndermek, işlem sonlandırılmasa bile bir hataya neden olmaz.)
  • Eğer gen_server yerel düğümde şu anda bağlı olmayan bir uzak düğüme çalışıyorsa, gen_server:cast bir arka plan işlemi oluşturacaktır. Bağlantıyı kurun ve mesajı gönderin ve hemen geri dönün, ! ise sadece bağlantı kurulduğunda geri döner. (gen_server:do_send kodunu bakınız.) Birini seçmek için zaman gelince

, çoğunlukla tat meselesi. İleti, gen_server için eşzamansız bir API işlevi olarak düşünülebiliyorsa, o zaman, cast kullanmalısınız, ve, gen_server geri çağrı modülünde belirli bir API işlevine sahip olmalıdır. Yani bunun yerine böyle doğrudan gen_server:cast çağırmak, geçerli:

gen_server:cast(foo_proc, {some_message, 42}) 

bir işlev çağrısını yapın

foo_proc:some_message(42) 

ve yukarıdaki direkt döküm gibi bu işlevi uygulamak. Bu, gen_server'in kendi modülü içindeki özel protokolünü içine alır.

Aklımda, API çağrılarının aksine, etkinlikler için "düz" iletiler kullanılacaktır. Bir örnek, {'DOWN', Ref, process, Id, Reason} numaralı monitör iletileri ve sisteminizde olabilecek benzer türdeki olaylar olabilir.

4

Legoscia postuna ek olarak, adanmış işlev API'sini mesajlardan daha kolay izleyebileceğimi söyleyebilirim. Özellikle eşya ortamında.

İlgili konular