Использование concurrent.futures.ThreadPoolExecutor генерирует исключение тайм-аута всегда в aws лямбда - PullRequest
1 голос
/ 30 января 2020

У меня есть следующий код в aws lambda, чтобы получить ответ от API, пока статус не будет завершен. Я использовал ThreadPoolExecutor из concurrent.futures.

Вот пример кода.

import requests
import json
import concurrent.futures

def copy_url(headers,data):
   collectionStatus = 'INITIATED'
   retries = 0
   print(" The data to be copied is ",data)
   while (collectionStatus != 'COMPLETED' or retries <= 50):
       r = requests.post(
              url=URL,
              headers=headers,
              data=json.dumps(data))
       final_status= r.json().get('status').pop().get('status')
       retries += 1
       print(" The collection status is",final_status)


with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future = executor.submit(copy_url,headers,data)
    return_value = future.result()

Я уже реализовал это, используя обычные потоки в python. Однако, так как я хотел получить возвращаемое значение из потока, попытался реализовать это. Хотя это прекрасно работает в pycharm, оно всегда выдает ошибку времени ожидания в aws lambda.

Может кто-нибудь объяснить, почему это происходит только в aws-lambda?

Примечание: Я уже пытался увеличить значение времени ожидания lambda. Это происходит только при реализации threadpoolexecutor. Когда я закомментирую этот код, он работает нормально. Также он работает нормально с обычной python реализацией потока

1 Ответ

0 голосов
/ 17 апреля 2020

Наконец, я изменил реализацию на прослушивание триггера SQS, а не ожидание ответа от API (API обрабатывается другим компонентом, и ответ займет значительное время)

Похоже, нам следует избегать использования задач параллельной обработки с python в aws лямбда-выражениях.

Из AWS документов :

Многопроцессорная обработка Модуль, который поставляется с Python, позволяет запускать несколько процессов параллельно. Поскольку среда выполнения Lambda не поддерживает / dev / shm (разделяемая память для процессов), вы не можете использовать multiprocessing.Queue или multiprocessing.Pool.

Если следует использовать multiprocessing , поддерживается только ТРУБА.

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