gen_server genannt timer_server verursacht Funktionen Timer-Modul nicht zurück
Frage
Ich habe einen Supervisor, der eine gen_server
gelaicht ich timer_server
genannt. Eine der Aufgaben dieser timer_serve
r ist die Registrierung zu verwalten und timer:send_interval
rufen eine Nachricht an einen pid auf einem bestimmten Intervall zu senden.
Doch in der init des gen_server
, wo ich anrufen timer:send_interval
ich eine Überbrückungs bekommen. Die Dokumentation, sagte der Timer: Funktionen sofort zurück, so dass dies sehr beunruhigend war
Wenn ich meine gen_server
umbenannt, dieses Problem record_timer_server
aufgeklärt. Meine Frage ist, zwei faltet dann:
- Warum kann ich einen registrierten Prozess
timer_server
erstellen, wenn es bereits eine ist, alstimer:start()
durch meine Anwendung startet aufgerufen wurde? - Einmal gestartet, warum soll diese Funktion nicht BadMatch veranlassen, den Namen zu finden, wenn es in meine
timer_server
mit dersend_interval
Funktion anrufen?
Ich glaube nicht, Code notwendig ist, aber ich kann aktualisiert einige hinzufügen, falls gewünscht.
Lösung
Dies kann einfach neu erstellt werden, indem die folgenden Aktionen, die auf der Anruf-Timer hängt. Send_interval
1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).
Während dies nicht gelingt ...
1> timer:send_interval(5000, self(), hello).
{ok,{interval,#Ref<0.0.0.32>}}
2> register(timer_server, self()).
** exited: {badarg,[{erlang,register,[timer_server,<0.30.0>]},
So scheint es, dass der erste Aufruf von Timer versucht, einen Prozess namens timer_server zu starten, und hängt, wenn Sie diesen Namen zuerst genommen haben.
Wie, warum es hängt timer.erl tut:
ensure_started() ->
case whereis(timer_server) of
undefined ->
C = {timer_server, {?MODULE, start_link, []}, permanent, 1000,
worker, [?MODULE]}
supervisor:start_child(kernel_safe_sup, C), % kernel_safe_sup
ok;
_ -> ok
end.
, die feinen zurückkehrt, von einem gen_server gefolgt: zu timer_server nennen. Ihr Prozess dann klemmt wartet auf sich selbst zu reagieren.