Остановить лямбда-функцию в Python

Внутри определенной функции я хочу остановить весь процесс Lambda, но не вызвать ошибку. Я пробовал смотреть на переменную контекста, чтобы остановить это, или просто вызывать exit(), но каждый раз это обрабатывается как ошибка, которую я не хочу отслеживать.

Как я могу успешно завершить лямбда-процесс в Python?

Не могли бы вы опубликовать код, который выдает ошибку.

Bal Krishna Jha 10.08.2018 09:24

@krishna просто exit(), и он регистрирует Process exited before completing request и регистрирует это как ошибку

Rudiger 10.08.2018 10:45

@JohnRotenstein Я пробовал как sys.exit (0), так и os._exit (1), и они все еще считаются ошибками

Rudiger 10.08.2018 13:00

Я переписал функцию, чтобы она возвращалась из основной функции, которая решила ее, помеченной как «ошибки», но все же было бы полезно знать.

Rudiger 10.08.2018 13:30

Lambda загружает и выполняет код вашей функции как модуль. Вот почему вам нужно создать функцию-обработчик, а не просто использовать обычную точку входа в скрипт. Когда вы вызываете exit() таким образом, вы убиваете все, вместо того, чтобы возвращаться из своей функции, как того ожидает сервер Lambda. Другими словами, exit() всегда будет выдавать это сообщение об ошибке. Вместо этого вам нужно вернуться из своей функции.

Mark B 10.08.2018 19:58

@MarkB Параметр предоставляется в NodeJS через contextstackoverflow.com/questions/38660024/…, однако он не предоставляется в context Python, насколько я могу судить. Тот же поток происходит в NodeJS, что и в Python, так почему же NodeJS не выдает ошибку, а Python делает?

Rudiger 11.08.2018 02:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
7
11 072
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В AWS Lambda вы определяете функцию handler, а в Python для успешного выполнения функции просто необходим return, где return подразумевает return None.

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

По памяти это было нелегко (я реорганизовал код, чтобы заставить его работать), потому что это была функция, вызываемая из handler, которая имела бы условие для остановки функции. Я считаю, что то, что я сделал, было return - это конкретная строка или что-то, что будет проверяться вызывающей функцией обработчика, а затем на основе этого будет return. Думаю, мне любопытно, почему версия Lambda для NodeJS имеет такую ​​возможность, а Python - нет. Некоторое время назад я заставил его работать с рефакторингом, так что моя память не очень хороша.

Rudiger 15.11.2018 01:40

В этом другом вопросе SO упоминаются устаревшие методы, например. context.done(), в новом SDK для nodejs вы должны использовать обратный вызов вместо docs.aws.amazon.com/lambda/latest/dg/…. Этот обратный вызов не является обязательным. В документах упоминается, что он неявно выполнит этот обратный вызов, если вы этого не сделаете, но это не конец выполнения, это просто для облегчения входа в CloudWatch. Функции Javascript будут по-прежнему завершены в конце цикла событий либо путем возврата явного значения, неявного значения undefined по умолчанию, либо путем выдачи исключения, как в Python.

Davos 15.11.2018 06:08

За кулисами Lambda runner - это просто какая-то функция python (или node или другой lang), которая обертывает вашу функцию, он вызывает вашу функцию, передает ей событие и контекст и ждет, пока ваша функция вернет или сгенерирует исключение. Когда вы вызываете другие функции внутри своего обработчика, вы делаете то же самое, в конечном итоге эти другие функции должны завершиться и вернуться к обработчику. Точкой входа и выхода для всей лямбды является и может быть только функция-обработчик.

Davos 15.11.2018 06:13

Другие вопросы по теме