2015-06-01 20 views
19

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.

cevap

31

(aşağıdaki örnekte 60 saniye) kendisini x saniye sonra mesaj gönderen bir GenServer kullanmalısınız:

defmodule MyApp.Worker do 
    use GenServer 

    def start_link() do 
    GenServer.start_link(__MODULE__, []) 
    end 

    def init([]) do 
    schedule_work() 
    {:ok, []} 
    end 

    def handle_info(:work, state) do 
    state = do_work(state) 
    schedule_work() 
    {:noreply, state} 
    end 

    defp do_work(state) do 
    # Do your work here and return state 
    end 

    defp schedule_work do 
    Process.send_after(self(), :work, 60_000) 
    end 
end 
+2

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

+4

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. –

+1

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

İlgili konular