[PYTHON] Achten Sie auf globale Variablen außerhalb von lambda_handler (datetime)

Einführung

Holen Sie sich die Zeit (Verweilzeit) zwischen der Schaffung eines Arbeitsplatzes und der Ausführung von Lambda Als ich Lambda kreierte Ich habe datetime verwendet, um das aktuelle Datum und die aktuelle Uhrzeit abzurufen. Also war ich süchtig nach "AWS Lambda verwendet Funktionsinstanzen wieder" Ich möchte einen Artikel machen.

Der Code, den ich zuerst geschrieben habe

Ermitteln Sie zuerst das aktuelle Datum und die aktuelle Uhrzeit, zu der Lambda ausgeführt wurde Unten finden Sie eine vereinfachte Version des Codes.

from datetime import datetime

now = datetime.now()

def lambda_handler(event, context):
    method_a()

def method_a():
    method_b()

def method_b():
    method_c()

def method_c():
#x steht für Datum und Uhrzeit der Erstellung des Jobs.
   time = now - x
   print(data)

Es wird ausgedrückt als.

Deklarieren Sie jetzt als globale Variable, um die Zeit darzustellen Ich habe es möglich gemacht, jede Methode anzuwenden.

Ich habe es vor Ort geschafft, aber ...

Da ich die Aufenthaltszeit vor Ort bekommen konnte, Ich habe es gerade gebaut und bereitgestellt, um Lambda zu erstellen. Der erste Lambda-Test war ebenfalls erfolgreich und es gab keine Probleme.

Gut! Lassen Sie es uns noch einmal testen und überprüfen ...

Das! ?? Die Verweilzeit ist seltsam! !! !! !! !! !!

Die Verweilzeit, die beim ersten Mal erfolgreich erhalten wurde Ich konnte es nach dem zweiten Mal nicht gut bekommen.

"Zeit" ist seltsam, egal wie oft ich es versuche.

Erstellen Sie also erneut und stellen Sie es erneut bereit Ich habe Lambda aktualisiert und es hat funktioniert.

Nach dem zweiten Mal war es jedoch nicht gut.

Die Ursache ist

Also, als ich verschiedene Dinge untersuchte, um die Ursache zu untersuchen Ich bin auf einen Artikel [hier] gestoßen (https://hacknote.jp/archives/50525/)!

Die Ursache war die globale Variable "now", die außerhalb von lambda_handler deklariert wurde.

Anscheinend ist Lambda zur Leistungsverbesserung Es ist wie die Wiederverwendung einer Instanz einer Funktion.

https://aws.amazon.com/jp/lambda/faqs/ image.png

Mit anderen Worten, Datum und Uhrzeit des ersten erfassten "Jetzt" werden zwischengespeichert. Es scheint, dass der gleiche Wert ab dem zweiten Mal wiederverwendet wurde.

Sagen Sie immer, dass Lambda-Funktionsinstanzen neu erstellt wurden Ich habe nachgedacht, also habe ich es überhaupt nicht bemerkt! !!

Ich möchte Variablen global in lambda_handler einfügen

Nach dem Verständnis der Ursache Vorerst habe ich "jetzt" in "lambda_handler" gesetzt. Dies wird jedes Mal, wenn Lambda ausgeführt wird, ein neues "Jetzt" -Datum und eine neue Uhrzeit erhalten.

from datetime import datetime

def lambda_handler(event, context):
    now = datetime.now()
    method_a(now)

def method_a(now):
    method_b(now)

def method_b(now):
    method_c(now)

def method_c(now):
#x steht für Datum und Uhrzeit der Erstellung des Jobs.
   time = now - x
   print(data)

Dies kann auch in dieser Form erfolgen. Es ist nicht cool, es mit einer solchen Methode zu bestehen Ich habe es wie folgt behoben.

from datetime import datetime

def lambda_handler(event, context):
    global now 
    now = datetime.now()
    method_a()

def method_a():
    method_b()

def method_b():
    method_c()

def method_c():
#x steht für Datum und Uhrzeit der Erstellung des Jobs.
   time = now - x
   print(data)

Dies ist auch nach dem zweiten Mal sicher Jetzt können Sie Datum und Uhrzeit abrufen, zu denen "jetzt" ordnungsgemäß ausgeführt wurde. Ich konnte "Zeit" gut bekommen.

Zusammenfassung

Zur Wiederverwendung von Lambda-Funktionsinstanzen Es war mein erstes Mal zu hören, also habe ich viel gelernt.

Danach sind globale Variablen sehr praktisch, Dass es leicht ist, unerwartete Fehler zu verursachen Ich erkannte es mit meinem eigenen Körper.

Ich werde vorsichtig sein, wie man es benutzt.

Recommended Posts

Achten Sie auf globale Variablen außerhalb von lambda_handler (datetime)
Achten Sie auf den Rückgabewert von __len__
Achten Sie auf Randint
Deklaration globaler Variablen der C-Sprache
25.03.2015 Python> Mehrzeiliger Kommentar> Achten Sie auf Einrückungen
Die Geschichte der Manipulation globaler Python-Variablen
Finden Sie den Tag nach Datum / Uhrzeit heraus