Bir sorun üzerinde çalışıyordum ve önceki bir programlayıcının PID standart sözleşmesini kullanarak mesajları ilettiği bir kod fark ettim! Mesaj. Gen_server: cast/2 kullanıyordum. Biri, ikisi arasında seçim yaparken kritik farklılıkları ve düşünceleri bana açıklayabilir mi diye merak ediyordum.Erlang: gen_server kullanımı arasındaki fark: cast/2 ve standart ileti geçiyor
cevap
birkaç küçük farklılıklar vardır:
- Açıkçası, gen_server
handle_info
yılındahandle_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.
Legoscia postuna ek olarak, adanmış işlev API'sini mesajlardan daha kolay izleyebileceğimi söyleyebilirim. Özellikle eşya ortamında.
- 1. Erlang'da gen_server: start() ve gen_server: start_link() arasındaki fark nedir?
- 2. Standart kitaplık ve standart şablon kitaplığı arasındaki fark nedir?
- 3. WorkflowInvoker ve WorkflowApplication kullanımı arasındaki fark nedir?
- 4. Gradle ve Maven Arasındaki Fark?
- 5. Python'da çift tırnak ve tırnak kullanımı arasındaki fark
- 6. CruiseControl.NET'de 'devenv' ve 'msbuild' kullanımı arasındaki fark nedir?
- 7. Slick'te DatabaseConfig ve Veritabanı kullanımı arasındaki fark nedir?
- 8. sklearn.cross_validation içinde train_test_split ve cross_val_score kullanımı arasındaki fark
- 9. OSGi paketi ve normal .JAR dosyaları kullanımı arasındaki fark
- 10. .exp kullanımı nedir ve .lib ile .dll arasındaki fark nedir?
- 11. Kıvılcımlar içinde hdfs: // ve iplik kullanımı arasındaki fark
- 12. arasındaki fark
- 13. RabbitMQ'nun Erlang istemcisindeki ileti üstbilgileri nasıl kullanılır?
- 14. Javascript: location.hostname ve document.domain arasındaki fark nedir?
- 15. erlang OTP Süpervizör çöküyor
- 16. Ascx ve .cshtml arasındaki fark nedir?
- 17. Düğüm js ve express js arasındaki fark
- 18. Mod_deflate ve zlib output_compression arasındaki fark
- 19. Task.Factory.FromAsync ve BeginX/EndX arasındaki fark nedir?
- 20. XeLaTeX ve pdfLaTeX arasındaki fark
- 21. javax.sql ve java.sql arasındaki fark?
- 22. netTcpContextBinding ve netTcpBinding arasındaki fark
- 23. Sürücü ve sağlayıcı arasındaki fark
- 24. HttpCookie ve Çerez arasındaki fark?
- 25. typedef arasındaki fark ve tanımlamak
- 26. Python'da {} ve [] arasındaki fark nedir?
- 27. Dize [] ve [dize] arasındaki fark
- 28. Redis ve kafka arasındaki fark
- 29. mapM ve forM arasındaki fark
- 30. ASCIIEncoding ve Encoding Arasındaki Fark