2016-11-05 86 views
5

Mam proces gen_server, który utrzymuje pulę, dla każdego przychodzącego żądania, muszę zbadać pulę, aby sprawdzić, czy istnieje dopasowanie dla tego przychodzącego żądania, jeśli istnieje, dopasowany jest usuwany z puli i odpowiedzi są składane do obu wniosków; jeśli go nie ma, nowy wniosek jest przekazywany do puli w celu późniejszego zbadania.Erlang: czy wiele timerów jest ok?

biz logika wymaga, jeżeli wniosek, R, siedzi w basenie dla T sekund bez zostały dopasowane, muszę złożyć odpowiedź na R mówiąc coś w stylu „nie mogę znaleźć dopasowanie dla ciebie”.

Idealnie, chcę to zrobić z timerem, w szczególności dla każdego przychodzącego żądania, jeśli nie ma dopasowania, umieść go w puli jak poprzednio, ale także uruchom zegar, aby nakazał serwerowi gen_server go usunąć, jeśli czas jest w górę, oczywiście, jeśli zostanie dopasowany później, timer powinien zostać anulowany.

Moim zmartwieniem jest to, że jeśli w puli jest wiele nieprzypisanych żądań, to będzie dużo liczników czasu, czy to (zbyt wiele timerów) stanie się problemem?

+1

Nie wszystkie timery działają tak samo, ja wiem, że 'timer: start' jest generalnie unikany i miał karę wykonania, podczas gdy używanie' erlang: send_after' w tysiącach procesów wydaje się być powszechne. – Reith

+0

@Reith Używam 'erlang: send_after' –

Odpowiedz

6

Dokonano dużych ulepszeń w implementacji timerów w R18.

Besides the API changes and time warp modes a lot of 
    scalability and performance improvements regarding time 
    management has been made internally in the runtime system. 
    Examples of such improvements are scheduler specific timer 
    wheels, scheduler specific BIF timer management, parallel 
    retrieval of monotonic time and system time on systems with 
    primitives that are not buggy. 

scheduler koła specyficzny czasowy jest dokładnie to, co jest interesujące w scenariuszu. Wątpię, żebyś znalazł lepsze rozwiązanie swojego problemu w Erlangu lub innym języku/środowisku. Zatem twoje rozwiązanie powinno być w porządku, gdy używasz R18 lub nowszego.

+1

W CodeMesh kilka dni temu Joe Armstrong zademonstrował przykład zrobienia dziesiątek tysięcy procesów, z których każdy przesypiał określoną godzinę, a następnie zagrał pojedynczą nutę MIDI. Działa doskonale! :-) – RichardC

+1

Dzięki, Hynek -Pichi- Vychodil. @RichardC Sam też uruchomiłem timery 10K, aby je przetestować, nawet nie miga. –