AWS Lambda, python 2.7 и время жизни переменных - PullRequest
0 голосов
/ 07 мая 2018

Я обнаружил, что инструкции python, которые не входят в основную функцию, но находятся в глобальной области видимости, запускаются только один раз, после того, как функция создана / обновлена ​​(и, возможно, после замены контейнера, но не проверила ее), что вызывает не то же самое поведение функции сначала и все последующие запуски. Тестовый код:

assets = []
print "======0. should be [] ========"
print(assets)   

def lambda_handler(event, context):
    global assets

    print "======l. should be [] ========"
    print(assets)   

    assets.append({
            "key": "val"
        })
    print "======2. should be [{'key': 'val'}] ========"
    print(assets)

    assets = {"data":assets}
    print "======3. should be {'data': [{'key': 'val'}]} ========"
    print(assets)

Когда я запускаю функцию в самый первый раз (или после того, как я обновил ее), у меня есть:

======0. should be [] ========
[]
START RequestId: ecdf063e-51f0-11e8-9783-7f18ff8ee142 Version: $LATEST
======l. should be [] ========
[]
======2. should be [{'key': 'val'}] ========
[{'key': 'val'}]
======3. should be {'data': [{'key': 'val'}]} ========
{'data': [{'key': 'val'}]}
END RequestId: ecdf063e-51f0-11e8-9783-7f18ff8ee142 

Это то, что я ожидаю, несмотря на то, что я запутался, почему вывод начался до «START». Проблема заключается в следующем: при следующем запуске assets переменная уже имеет старое значение:

START RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56 Version: $LATEST
======l. should be [] ========
{'data': [{'key': 'val'}]}
'dict' object has no attribute 'append': AttributeError
Traceback (most recent call last):
  File "/var/task/test.py", line 11, in lambda_handler
    assets.append({
AttributeError: 'dict' object has no attribute 'append'

END RequestId: 66999707-51f1-11e8-b21a-9963eeb4aa56

Как вы можете видеть, вывод ======0. should be [] ======== отсутствует, а переменная уже имеет значение.

Я не гуру Python, поэтому я делаю что-то не так или это ошибка?

1 Ответ

0 голосов
/ 07 мая 2018

Лямбда может или не может повторно использовать ту же функцию при повторном ее запуске, поэтому, другими словами, возможно, что какое-то состояние останется между запусками - вам нужно убедиться, что вы ничего не предполагаете - поэтому, если вам нужно что-то инициализировать, делайте это в самой функции, а не в глобальной области видимости.

Эта статья http://rodos.haywood.org/2015/06/lambda-functions-idempotent.html, хотя о nodejs, а не python, в значительной степени это объясняется.

...