Bir Phoenix uygulamasının yanında tekrar tekrar aynı işlem dizisini çalıştırmak istiyorum (tabii ki işçide frenler varsa tüm web uygulaması çökerse) ve GenServer kullanmam gerekip gerekmediğini gerçekten bilmiyorum. , Elixir'in Görevleri, bir Ajan ya da şu ana kadar hiç düşünmediğim tamamen farklı bir şey."Bitmeyen" bir görev tekrarı için hangi OTP davranışını kullanmalıyım?
Phoenix uygulamamı başlattığımda bir çalışan da başlamalıdır, bu periyodik olarak bir seri bağlantının bazı değerlerini çeker, bunları bir Phoenix kanalı üzerinden yayınlar, @save_interval
ulaşılana kadar toplar ve sonra medyan, ortanca yayınları hesaplar. Farklı bir kanal aracılığıyla ve bir InfluxDB'ye yazar. Şu anda böyle bir şey (çalışma türü) vardır:
def do_your_thing(serial_pid) do
Stream.interval(@interval_live)
|> get_new_values_from_serial(serial_pid)
|> broadcast!("live-channel:#{@name}")
|> Enum.take(div(@interval_save, @interval_live))
|> calculate_medians()
|> broadcast!("update-channel:#{@name}")
|> write_to_database()
do_your_thing(serial_pid) # repeat
end
Ben sadece tüm bu OTP şeyleri anlamaya başladım ve sizin birileri beni burada doğru yönde yanılmak yardımcı olabilir umuyoruz.
Neden muhtemelen Çayı'nın tarafından desteklenmektedir sonsuz döngüye (içinde periyodik olarak şeyler yapar bir görev. aralık veya Stream.repeatedly)? Eğer bu sadece çekilen verileri sisteme ileten bir periyodik çekişse, gerçekten bir GenServer olmak zorunda değil. Görev hala OTP uyumlu ve bana göre iş için daha kolay görünüyor. – sasajuric
Bunun nedeni, Görev'in sistem iletilerini alamamasıdır. Akış ve arkadaşların bunlardan haberdar olmasını istiyoruz ancak 1.0'da değil ve muhtemelen sadece 1.3'te olacak. –
Ayrıca, Denetim Görevlilerinizin, periyodik çalışmayı yapan işçiyi yeniden başlatmasını isteyebilirsiniz; bunun yerine, bir şeylerin yanlış gitmesi durumunda, Sonsuz Akış, geçerli işlemi çökmesine izin vermek yerine. – Letseatlunch