2015-07-14 21 views
8

Qual è il modo migliore in elixir per creare un processo in primo piano che ticcherà su ogni dato intervallo di tempo?Come creare un emettitore di eventi con elisir, il modo alternativo

Il mio problema principale è che un approccio come:

defmoulde Ticker do 
    def tick do 
    do_something() 
    :timer.sleep(1000) 
    tick 
    end 
end 

opere, ma è sbagliato di progettazione. Sicuramente non ticchetta ogni secondo, ma ogni secondo PIÙ il tempo necessario per fare_qualcosa(). Potrei generare un processo per gestire il "qualcosa" ma c'è ancora un piccolo ritardo.

Inoltre, sto cercando di creare un'app mix, ci sono alcuni GenServer coinvolti e un processo principale in primo piano (quello che sto chiedendo qui) che dovrebbe chiamare i server ogni x secondi. C'è un altro modo per farlo?

risposta

13

Penso che timer:apply_interval/4 dovrebbe soddisfare le vostre esigenze. Viene usato qualcosa di simile:

defmodule Tick do 
    def tick do 
    IO.inspect(:tick) 
    end 
end 

:timer.apply_interval(:timer.seconds(1), Tick, :tick, []) 

Gli argomenti sono nell'ordine l'intervallo, un nome di modulo, la funzione di chiamare e gli argomenti per chiamare con. Quindi puoi inviare messaggi al tuo GenServers all'interno di quella funzione. Controlla la documentazione completa qui: apply_interval/4

Un'altra cosa da considerare è che se la vostra funzione tick è sempre e solo l'invio di messaggi semplici ad alcuni GenServers, allora è probabilmente estremamente veloce, quindi l'implementazione potrebbe essere OK, una volta avvolto in a Task e inserito nell'albero di supervisione (se non ti interessa il potenziale leggero spostamento).

+1

Mi preoccupo della deriva del tempo potenziale. Come potrei evitare qualsiasi deriva temporale? –

+1

'apply_interval' dovrebbe essere abbastanza decente, ma i documenti affermano solo che" I timeout non sono esatti, ma sono lunghi almeno quanto richiesto ". –