并发.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中抛出超时异常的主要内容,如果未能解决你的问题,请参考以下文章

并发数并发以及高并发分别是什么意思?

Jmeter并发设置

并发编程的基础

nodejs每秒并发多高

掌握系列之并发编程-1.并发基础

Java并发编程:并发容器ConcurrentHashMap