2016-11-05 14 views
5

Ich habe einen gen_server Prozess, der einen Pool verwaltet, für jede eingehende Anfrage muss ich den Pool untersuchen, um zu sehen, ob es eine Übereinstimmung für diese eingehende Anfrage gibt, falls es eine gibt, wird die übereinstimmende aus dem Pool entfernt und antwortet werden auf beide Anfragen gemacht; Wenn keine vorhanden ist, wird die neue Anfrage zur späteren Untersuchung in den Pool gestellt.Erlang: ist viele Timer in Ordnung?

Die biz-Logik erfordert, dass, wenn eine Anforderung, R, für T Sekunden im Pool sitzt, ohne angepasst worden, ich brauche eine Antwort auf R sagen, etwas zu machen, wie „ich für Sie ein Spiel nicht finden können“.

Idealerweise möchte ich dies mit Timern machen, speziell für jede eingehende Anfrage, wenn es keine Übereinstimmung gibt, lege sie wie zuvor in den Pool, starte aber einen Timer, um den gen_server zu informieren, wenn es Zeit ist natürlich, wenn es später abgestimmt wird, sollte der Timer abgebrochen werden.

Meine Sorge ist, dass, wenn es viele unübertroffene Anfragen im Pool gibt, dann würde es viele laufende Timer geben, wird dies (zu viele Timer) ein Problem werden?

+1

Nicht alle Timer arbeiten auf die gleiche Weise, ich weiß, "timer: start" wird im Allgemeinen vermieden und hatte eine Leistungseinbuße, während die Verwendung von "erlang: send_after" in Tausenden von Prozessen üblich scheint. – Reith

+0

@Reith Ich benutze 'erlang: send_after' –

Antwort

6

Es wurden große Verbesserungen bei der Timer-Implementierung in R18 gemacht.

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 spezifische Timer Räder ist genau das, was in Ihrem Szenario interessant ist. Ich bezweifle, dass Sie besser performante Lösung Ihres Problems in Erlang oder einer anderen Sprache/Umgebung kommen würden. Ihre Lösung sollte also in Ordnung sein, wenn Sie R18 oder neuer verwenden.

+1

Joe Armstrong demonstrierte vor ein paar Tagen ein Beispiel von CodeMesh, indem er Zehntausende von Prozessen hervorbrachte, die jeweils eine bestimmte Zeit lang schliefen und dann eine einzelne MIDI-Note spielten. Arbeitete perfekt! :-) – RichardC

+1

Danke, Hynek -Pichi- Vychodil. @RichardC Ich habe auch selbst 10K Timer zum Testen gestartet, es blinkt nicht einmal. –