[PYTHON] Attention aux variables globales en dehors de lambda_handler (datetime)

introduction

Obtenir le temps (temps de séjour) entre la création d'un travail et l'exécution de Lambda Quand je créais Lambda J'utilisais datetime pour obtenir la date et l'heure actuelles, J'étais donc vraiment intéressé parce que "AWS Lambda réutilise les instances de fonction". J'aimerais faire un article.

Le code que j'écrivais en premier

Premier pour obtenir la date et l'heure actuelles de l'exécution de Lambda Voici une version simplifiée du code.

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 représente la date et l'heure de création du travail.
   time = now - x
   print(data)

Il est exprimé comme.

Déclarer maintenant en tant que variable globale pour représenter l'heure J'ai rendu possible l'utilisation de n'importe quelle méthode.

J'ai réussi localement, mais ...

Depuis que j'ai pu obtenir le temps de séjour localement, Je viens de le construire et de le déployer pour créer Lambda. Le premier test Lambda a également été un succès et il n'y a eu aucun problème.

D'accord! Testons-le à nouveau et vérifions ...

cette! ?? Le temps de séjour est étrange! !! !! !! !! !!

Le temps de séjour obtenu avec succès la première fois Je n'ai pas pu bien comprendre après la deuxième fois.

«Le temps» est étrange, peu importe le nombre de fois que j'essaye.

Alors construisez et déployez à nouveau J'ai mis à jour Lambda et cela a fonctionné.

Cependant, ce n'était pas bon après la deuxième fois.

La cause est

Alors quand j'enquêtais sur diverses choses pour enquêter sur la cause Je suis tombé sur un article ici!

La cause était la variable globale «now» déclarée en dehors de lambda_handler.

Apparemment, Lambda est pour l'amélioration des performances C'est comme réutiliser une instance d'une fonction.

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

En d'autres termes, la date et l'heure du premier "maintenant" acquis sont mises en cache. Il semble que la même valeur ait été réutilisée à partir de la deuxième fois.

Dites toujours que les instances de fonction Lambda sont nouvellement créées Je réfléchissais, donc je ne l'ai pas remarqué du tout! !!

Je veux mettre des variables globalement dans lambda_handler

Après avoir compris la cause Pour le moment, j'ai mis now dans lambda_handler. Cela obtiendra une nouvelle date et heure «maintenant» à chaque exécution de Lambda.

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 représente la date et l'heure de création du travail.
   time = now - x
   print(data)

Cela peut également être fait sous cette forme, Ce n'est pas cool de le transmettre via une méthode comme celle-ci Je l'ai corrigé comme suit.

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 représente la date et l'heure de création du travail.
   time = now - x
   print(data)

C'est sûr, même après la deuxième fois Vous pouvez maintenant obtenir la date et l'heure auxquelles now a été correctement exécuté. J'ai pu bien gagner du temps.

Résumé

Pour réutiliser des instances de fonction Lambda C'était la première fois que j'entendais, alors j'ai beaucoup appris.

Après cela, les variables globales sont très pratiques, Qu'il est facile de provoquer des bugs inattendus Je l'ai réalisé avec mon propre corps.

Je ferai attention à son utilisation.

Recommended Posts

Attention aux variables globales en dehors de lambda_handler (datetime)
Attention à la valeur de retour de __len__
Attention à randint
Déclaration des variables globales du langage C
25/03/2015 python> Commentaire sur plusieurs lignes> Attention au retrait
L'histoire de la manipulation des variables globales Python
Découvrez le jour par date / heure