gen_server genannt timer_server verursacht Funktionen Timer-Modul nicht zurück

StackOverflow https://stackoverflow.com/questions/500169

  •  20-08-2019
  •  | 
  •  

Frage

Ich habe einen Supervisor, der eine gen_server gelaicht ich timer_server genannt. Eine der Aufgaben dieser timer_server 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:

  1. Warum kann ich einen registrierten Prozess timer_server erstellen, wenn es bereits eine ist, als timer:start() durch meine Anwendung startet aufgerufen wurde?
  2. Einmal gestartet, warum soll diese Funktion nicht BadMatch veranlassen, den Namen zu finden, wenn es in meine timer_server mit der send_interval Funktion anrufen?

Ich glaube nicht, Code notwendig ist, aber ich kann aktualisiert einige hinzufügen, falls gewünscht.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top