amazon-web-services - 如何在没有数千个连接的情况下同时调用 AWS Lambda?
问题描述
我正在尝试同时调用 AWS Lambda 来抓取一些网址。这样做时,我ThreadPoolExecutor
会调用 lambda。我将 url 分成大小为 50 的批次,以限制同时运行的 lambda 的数量。然后我等待它们结束,并期望连接数被限制为 50。但是,相反,我看到 boto3 创建了 > 1000 个连接。
这是代码:
def scrape(data):
with ThreadPoolExecutor(max_workers=10) as executor:
result = []
for source_url, info in data.items():
urls = info['urls']
source = info['source']
for batch in batches(urls, 50):
futures = []
for url in batch:
payload = {
'url': url,
'country': source['country'],
'language': source['language'],
'topic': source['topic']
}
futures.append(
executor.submit(client.invoke,
FunctionName='scrape_page',
InvocationType='RequestResponse',
Payload=bytes(json.dumps(payload), 'utf-8')))
result.extend([future.result() for future in futures])
return [json.loads(r['Payload'].read().decode('utf-8')) for r in result]
这是同时调用 AWS Lambda 的正确方法,还是有更好的方法?
解决方案
您的问题需要像其他人提到的那样提供更多细节,但是想指出一些事情。
- 除了在 lambda 中使用线程之外,您还可以使您的任务具有幂等性并将它们分发给多个 lambda。
- lambda 可用的核心数(1 个核心=2 个线程)与函数内存成正比,只有当您选择大于 1.8G 的内存大小时,您才会获得超过 1 个核心。而 afaik 您不会获得超过 2 个最大核心内存设置。
- 您可以通过配置 Reserved Concurrency 来限制并发执行,这将保证在任何时候并发 lambda 的数量都不会超过配置的数量。
推荐阅读
- python-3.x - 如何通过搜索列表中给出的关键字值在 Python pandas 数据框中添加新列?
- c# - C# 可空性未正确推断
- javascript - 就像我们在 android 中与 WhatsApp 共享数据(文本/文件/IMG)一样,我们可以为桌面 WhatsApp 应用程序做同样的事情吗?
- angular - 从 Markdown 文件中渲染角度分量
- python - “TypeError: unhashable type: 'Dimension'” with BatchNormalization(axis=CHANNEL_AXIS)(input)
- r - 根据列名将矩阵拆分为两个数组
- typescript - 处理泛型函数的记录
- django - 如何在django模板中的4个元素之后创建一个div
- python - Pandas 数据框中的键/值对
- javascript - 如何使用browserify连接目录中的所有文件?