一些背景:
我正在开发一个测试套件,用于使用 CodePipeline 和两个 lambda 函数更新和测试全局重定向:一个包装器函数和一个测试器函数。
包装器循环遍历域列表。对于每个域,它获取关联的 S3 文件,然后创建一长串对象(文件中每行一个对象)。示例对象:
redirect = {
'staging': None,
'prod': None,
'country': 'US',
'language': 'EN',
'status_code': None,
'shortlink': None,
'expected': None
}
包装器然后获取这个对象列表并调用第二个 lambda(测试者 lambda),它为每个对象发送一系列 httpx 请求等等。
<块引用>最重要的是它是异步的 - 否则,lambda 将在 15 分钟标记处超时。
实际问题:
wrapper 函数只能触发测试器 10 次。否则,当返回结果时,我收到此错误:
Connection pool is full, discarding connection: lambda.us-east-1.amazonaws.com
我为 ThreadPoolExecutor 增加了 max_workers,甚至为 boto3 设置了 max_workers。我与 AWS 支持人员进行了交谈,我的实际 lambda 设置有助于根据需要多次触发我的测试人员 lambda。但是,我仍然收到连接池错误。
相关代码:
from botocore.client import Config
from boto3.session import Session
from concurrent.futures import ThreadPoolExecutor, as_completed
import boto3
max_pool_connections = 30
config = Config(
max_pool_connections=max_pool_connections,
read_timeout = 900
)
def handler(event, context):
try:
events = ... # generated via a bunch of nonsense
with ThreadPoolExecutor(max_pool_connections) as executor:
futures = []
for event in events:
print(event)
future = executor.submit(lambda_client.invoke, FunctionName = "site-tester", InvocationType = "RequestResponse", Payload = json.dumps(event))
futures.append(future)
for index, future in enumerate(as_completed(futures, timeout=None), start=1):
...
这(显然)不是完整的代码,因为完整的代码绝对是一堆废话。我目前没有时间创建完整的测试功能,但如果有人有任何初步想法或故障排除提示,我们将不胜感激。
我确实要注意,对于 10 个确实被调用和返回的事件,一切都按预期工作。它仅限于 10 次,我绝对需要更多。
<块引用>这里最重要的一点是它是异步的 - 否则,lambda 将在 15 分钟标记处超时。
并发设置
wrapper 函数:保留并发设置为 30
tester 函数:保留并发设置为 30
答案 0 :(得分:2)
所以 warning 本身来自 urllib3
用来发出 HTTP 请求的 boto3
库。
max_pool_connections
配置选项为 ConnectionPool 类设置 maxsize
。
您可以尝试进一步增加此选项,看看这是否有帮助,但不要添加更多线程工作者。
不清楚你是如何从你的代码中创建客户端的,但看起来资源不是线程安全的,应该为每个线程/进程创建一个单独的:
Multithreading and multiprocessing:
<块引用>注意
资源不是线程安全的。这些特殊类包含 不能在线程之间共享的附加元数据。使用时 一个资源,建议为每个资源实例化一个新的资源 线程,如上例所示。
低级客户端是线程安全的。使用低级客户端时,它 建议实例化您的客户端,然后传递该客户端对象 到您的每个线程。