2016-05-20 7 views
2

Ich möchte eine Anwendung testen und habe beschlossen, Konfigurationsparameter mit Umgebungsvariablen an meine erlang-Anwendung zu übergeben. Derzeit lese ich sie als ein Makro mit -define(PARAMETER1, os:getenv("PARAMETER1")).Erlang: Umgebungsvariablen lesen und einer Konstante zuweisen

Allerdings wird bei dieser Implementierung die Variable bei jedem Anruf gelesen (Und ich bin mir nicht sicher über die Leistung dieses Aufrufs).

Gibt es eine Möglichkeit, Umgebungsvariablen beim Starten der Anwendung nur einmal zu lesen?

Antwort

2

ist ein Makro, also wird der Inhalt des Makros bei jeder Verwendung des Makros in den tatsächlichen Code eingefügt. Sie müssen nur os:getenv/1 in einer Funktion einmal anrufen, sollte sie in dem Zustand, und gibt sie an die Aufsichtsbehörden und andere Module, die diese Umgebungsvariable benötigen, for example:

start(_StartType, _StartArgs) -> 
    case get_cfg() of 
     {error, _} = Err -> Err; 
     Cfg -> start_sup(Cfg) 
    end. 

get_cfg() -> 
    try 
     hbd_cfg:setup() 
    catch 
     throw:Term -> {error, Term} 
    end. 

start_sup(Cfg) -> 
    case hbd_sup:start_link(Cfg) of 
     {ok, Pid} -> 
      hbd_event_logger:add_handler(), 
      {ok, Pid}; 
     Other -> 
      {error, Other} 
    end. 

In diesem Beispiel wird die Konfiguration einmal gelesen wird in get_cfg/0 und dann ging es an den Vorgesetzten, der es an beaufsichtigte Arbeiter weitergibt.

+0

Dies ist für einmal zu lesen und es an den Arbeiter zu übergeben. Aber wie kann ich auf diese Informationen zugreifen? Wie man sie speichert, um einfachen Zugang zu haben, ohne sie von Funktion zu Funktion zu übergeben. Ich schreibe eine Anwendung, in der ich einen rohen Socket höre und wann immer ein Paket ankommt, brauche ich die Informationen, die in meinem os vars konfiguriert sind. – muehsi

+0

Sie könnten den gelesenen Wert in der ETS speichern, auf die von jedem Prozess aus zugegriffen werden kann. Oder Sie können es in einem separaten "gen_server" speichern und fragen Sie den "gen_server" für den Wert jedes Mal, wenn Sie es brauchen. Es geht nicht anders. Erlang wurde entwickelt, um eine funktionale Sprache zu sein, die keinen einfachen Zugang zum Shared State bietet. Eine Funktion kann nur Daten verwenden, die explizit an sie übergeben wurden oder die sie mit anderen Funktionen abfragen können (in diesem Fall "os: getenv", "ets", dedicated "gen_server" oder ähnliches). Dies gilt natürlich für dynamische Daten, die während des Programmlaufs gelesen werden, nicht für statische Daten, die dem Compiler bekannt sind. – Amiramix

Verwandte Themen