200 ок ответ на запрос, прежде чем работа будет сделана в aws лямбда - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь ответить на запрос в 200 раз, прежде чем работа будет завершена, однако работа, которую мне нужно сделать, занимает больше 3 секунд, в течение которых мне нужно получить ответ.

Я работаю в aws лямбда и способ, которым я подошел к этому, был через многопоточность:

t = threading.Thread(target=worker, args=(xml,))
t.start()

# So that you can return before worker is done
return response(200)

Однако, даже когда я выполнял работу, выполняемую в фоновом режиме, кажется, что aws лямбда не закончится sh работа. Кажется, что как только ответ получен, лямбда просто отключается. Например, если на выполнение работы уходит 2 секунды, следующее не сработает:

t = threading.Thread(target=worker, args=(xml,))
t.start()

# So that you can return before worker is done
return response(200)

, но если мы поспим 2 секунды, работа будет выполнена:

t = threading.Thread(target=worker, args=(xml,))
t.start()
time.sleep(2)
# So that you can return before worker is done
return response(200)

Если это так, что я могу сделать, чтобы получить ответ 200 ok на запрос с aws лямбда, но также можно ли выполнить работу в той же самой функции лямбда?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Я предполагаю, что вы используете AWS API-шлюз для вызова вашей лямбда-функции (отсюда и возврат кода состояния 200).

Существует два способа вызова лямбда-выражения, способ sync и event или async способ. API Gateway по умолчанию использует первый способ, если вы явно не укажете обратное Чтобы сделать вашу лямбда-интеграцию async по умолчанию, вы должны добавить собственный заголовок:

X-Amz-Invocation-Type: Event

В консоли API Gateway. Вы также можете добавить заголовок

InvocationType: Event

в вызовы клиента

0 голосов
/ 24 января 2020

Потоковое решение не будет работать, потому что после отправки ответа ваша среда Lambda будет закрыта. Вам нужно запустить AWS лямбда-функцию в режиме async вместо event. См. это руководство для одного возможного решения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...