2015-07-14 6 views
8

Jaki jest najlepszy sposób w eliksirie do tworzenia procesu pierwszego planu, który zaznacza się w danym przedziale czasu?Jak stworzyć emiter zdarzeń z eliksirem, sposobem OIP

Moim głównym problemem jest to, że podejście takie jak:

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

działa, ale jest źle z projektem. Na pewno nie tyka co sekundę, ale co drugi PLUS czas na do_something() do ukończenia. Mogę odrodzić proces obsługi "czegoś", ale nadal istnieje niewielkie opóźnienie.

Staram się również zbudować aplikację do miksowania, jest w niej zaangażowanych GenServer i główny proces pierwszego planu (ten, o który tutaj pytam), który powinien wywoływać serwery co x sekund. Czy istnieje sposób na robienie tego?

Odpowiedz

13

Myślę, że timer:apply_interval/4 powinien odpowiadać Twoim potrzebom. Stosuje się go mniej więcej tak:

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

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

Argumenty są w porządku przerwie nazwę modułu, funkcja wzywania i argumenty zadzwonić go. Następnie możesz wysyłać wiadomości do swojego urządzenia GenServers. Sprawdź pełną dokumentację tutaj: apply_interval/4

Kolejną rzeczą wymagającą rozważenia jest to, że jeśli funkcja tick jest tylko kiedykolwiek wysyłania prostych wiadomości do pewnego GenServers to chyba niezwykle szybko, dzięki czemu realizacja może być OK, gdy zawinięte w a Task i podłączony do drzewa nadzoru (jeśli nie dbasz o potencjalny lekki dryf, który jest).

+1

Dbam o potencjalny dryf czasu. Jak uniknąć dryfu w czasie? –

+1

'apply_interval' powinno być całkiem przyzwoite, ale doktor tylko stwierdza, że" limity czasu nie są dokładne, ale są co najmniej tak długo, jak zażądano ". –