2011-06-01 33 views
10

Gen_Fsm ve Gen_Server belgelerini inceledikten sonra, aşağı yukarı benzer davranışlarda bulunduklarını gördüm. Benim görüşüme göre, yayın veya dinleme tcp çorap göndermek için bir döngü işlevi varsa, Gen_Fsm kullanmak veya gen_server kullanmak için daha iyidir. doğru olup olmadığını bilmek istiyorum?Gen_Fsm ne zaman kullanılır ve Gen_Server ne zaman kullanılır?

cevap

9

gen_server ve gen_fsm'un işlevsellikte çok benzer olduğunu doğru gördünüz. Ancak, çoğu programda, gen_fsm kullanımından daha fazla gen_server vardır.

Benim düşünceme göre gen_fsm sadece% 100 kullanımı gen_fsm modeline uygun olduğunda kullanışlıdır. Yani probleminize uyan basit ve net sonlu bir durum makinesi olmalı. Genellikle FSM'nin devlet sayısının gerçek dünya karşısında patlamaya eğilimli olduğunu unutmayın.

kendinizi 'gen_server geçmek ve gen_fsm eklemek lar State değişken onun muhtemelen zaman' State değişkene ler devlet gen_fsm ikincil durum bilgisi çok sahip bulursanız

.

Genellikle şüphe olduğunda: (genellikle gen_fsm kötü çıkar) seçici kullanmak alamazsınız olmasıdır gen_server ve gen_fsm hem gen_server

Bir dezavantaj kullanın. Seçici alım, gerçek dünya uygulamalarında durum makinesi karmaşıklığını azaltmak için önemli bir araçtır.

Hem seçici alım hem de OTP davranışlarından yararlanmak için plain_fsm'u öneririm.

+0

dediniz ki: "... seçici alımını kullanamazsınız", neden bu? İlgilendiğimiz mesajlara, "gen_blah_blah" ve sistem mesajları gibi dokunmadığımız sürece, biz iyiyiz diye düşünüyorum. Gelen mesajın formatını kontrol edebiliyorsak, sadece ilgilendiğimizleri alabiliriz, bu gibi "alma {some_app_specific_message_tag, Msg} -> ..." –

+0

@NotanID iyi seçmeniz gerekir "handle_info' ve 'gen_server: call | cast' kullanamayacak. Bu noktada, plain_fsm daha iyi bir seçimdir. – niahoo

İlgili konular