我有一个 AWS Lambda 函数:
import boto3
import json
import concurrent.futures
from stats import Timer
client = boto3.client('lambda')
def do_lambda():
timer = Timer()
response = client.invoke(
FunctionName = 'arn:aws:lambda:us-east-1:497857710590:function:wherewasit-search',
InvocationType = 'RequestResponse',
Payload = json.dumps({'keys': 1}))
payload = json.loads(json.load(response['Payload'])['body'])
print(f"Response after {timer.stop()}ms")
def do_work(n_threads):
timer = Timer()
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
for i in range(n_threads):
futures.append(executor.submit(do_lambda))
for future in concurrent.futures.as_completed(futures):
pass
print(f"Joined all: {timer.stop()}ms")
def lambda_handler(event, context):
do_work(9)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
输出:
Response after 1236ms
Response after 1242ms
Response after 1251ms
Response after 1272ms
Response after 1322ms
Response after 1359ms
Response after 1126ms
Response after 1170ms
Response after 1246ms
Joined all: 2496ms
假设所有线程最多在 1.4 秒内完成,那么在所有线程连接之前又花费了多少秒?
也许您的问题与AWS或boto3无关。尝试运行这个:
它应该产生与程序的输出非常相似的输出。“Joined all”时间大约是九个
do_lambda()
调用中任何一个调用打印的“Response after”时间的两倍,因为线程池最多可以有八个工作线程。do_lambda()
直到至少一个其他调用完成后,最后一个调用才能开始。我的程序明确指定了
max_workers
. 您的程序创建一个具有默认最大工作线程数的线程池。那个数字是多少?(我的 Python 安装中的默认值似乎是 12。)如果它小于 9,但大于 4,那么程序的行为几乎符合您的预期。Alt 解释:(这似乎不太可能,但我对此一无所知
boto3
,所以也许......)也许有一些正在
boto3
使用的池化资源,并且该池的默认大小可能小于 9 但大于 4。