[英]calling an AWS Lambda function asynchronously from python with async/await
我有一个 AWS lambda function 我需要异步调用(即发即弃)并在以非阻塞方式完成时取回结果。
loop = asyncio.get_event_loop()
async def f(payload):
lambda_client = boto3.client('lambda')
response = lambda_client.invoke(
FunctionName='FUNC_NAME',
InvocationType='RequestResponse',
LogType='Tail',
Payload=payload,
Qualifier='$LATEST'
)
response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)
return response_dict
async def g():
payload = json.dumps({
"test_bucket": "MY_BUCKET",
"test_key": "my_test_key.csv",
"testpred_bucket": "MY_BUCKET",
"testpred_key": "my_test_key_new.csv",
"problem": "APROBLEM"
})
# Pause here and come back to g() when f() is ready
r = await f(payload)
print(r)
这行得通,但这并不能真正达到fire and forget
的目的。 我知道我需要使用asyncio.ensure_future
但是如果我这样做asyncio.ensure_future(f(payload))
,我如何捕获 function f
的返回值。 我是 python 异步的新手,目前还不清楚。
有人可以建议吗?
loop = asyncio.get_event_loop()
if loop.is_closed():
loop = asyncio.new_event_loop()
#The perform_traces method i do all the post method
task = loop.create_task(perform_traces(payloads, message, contact_centre))
unique_match, error = loop.run_until_complete(task)
loop.close()
在perform_trace
方法中,这就是我使用等待 session 的方式
future_dds_responses = []
async with aiohttp.ClientSession() as session:
for payload in payloads:
future_dds_responses.append(dds_async_trace(session, payload, contact_centre))
dds_responses, pending = await asyncio.wait(future_dds_responses)
在dds_async_trace
这就是我使用 aiohttp.ClientSession session 完成帖子的方式
async with session.post(pds_url,
data=populated_template_payload,
headers=PDS_HEADERS,
ssl=ssl_context) as response:
status_code = response.status
我能够用asyncio.ensure_future
解决这个问题
import boto3
import json
from flask import jsonify
import signal
import sys
import asyncio
import aiohttp
import json
def run():
loop = asyncio.get_event_loop()
loop.run_until_complete(run_job())
async def run_job():
asyncio.ensure_future(launch_lambda()) # fire and forget async_foo()
print('waiting for future ...')
async def launch_lambda():
payload = json.dumps({
"test_bucket": "my_bucket",
"test_key": "my_test_key",
"testpred_bucket": "my_bucket",
"testpred_key": "my_pred_key",
"problem": "APROBLEM"
})
result = await get_lambda_response(payload)
print(result)
async def get_lambda_response(payload):
lambda_client = boto3.client('lambda')
response = lambda_client.invoke(
FunctionName='FUNC_NAME',
InvocationType='RequestResponse',
LogType='Tail',
Payload=payload,
Qualifier='$LATEST'
)
response_body = response['Payload']
response_str = response_body.read().decode('utf-8')
response_dict = eval(response_str)
return response_dict
run()
您需要将 InvocationType 设置为 'Event'
import boto3
lambda_client = boto3.client('lambda')
lambda_payload = {"name:"name","age":"age"}
lambda_client.invoke(FunctionName='myfunctionname',
InvocationType='Event',
Payload=lambda_payload)
有关更多信息,请参阅: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.