并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常

问题描述 投票:1回答:1

我在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线程实现中,它也可以正常工作]

amazon-web-services aws-lambda python-3.7 concurrent.futures
1个回答
0
投票

最后,我将实现更改为侦听SQS触发器,而不是等待来自API的响应(该API由其他组件处理,响应将花费大量时间)

看起来我们应该避免在aws lambda中对python使用并行处理任务。

从AWS docs

Python随附的多处理模块使您可以运行多个进程并行。由于执行Lambda不支持/ dev / shm(进程共享内存)的环境,您不能使用multiprocessing.Queue或multiprocessing.Pool。

如果应该使用multiprocessing,则仅支持PIPE。

© www.soinside.com 2019 - 2024. All rights reserved.