并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常相关的知识,希望对你有一定的参考价值。
我在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线程实现中,它也可以正常工作]
最后,我将实现更改为侦听SQS
触发器,而不是等待来自API的响应(该API由其他组件处理,响应将花费大量时间)
看起来我们应该避免在aws lambda中对python使用并行处理任务。
从AWS docs:
Python随附的多处理模块使您可以运行多个进程并行。由于执行Lambda不支持/ dev / shm(进程共享内存)的环境,您不能使用multiprocessing.Queue或multiprocessing.Pool。
如果应该使用multiprocessing
,则仅支持PIPE。
以上是关于并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常的主要内容,如果未能解决你的问题,请参考以下文章