Asyncio 在我的 Python3.7 lambda 中不工作
Asyncio is not working within my Python3.7 lambda
我正在尝试创建一个 python3.7 lambda,它正确地使用 asyncio 进行线程处理。
我尝试了许多不同的代码变体,但这是最新的块。我正在使用 AWS Xray 查看时间,很容易验证异步是否正常工作。所有这些任务和调用都是同步完成的。
import json
import boto3
import asyncio
from botocore.exceptions import ClientError
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
#xray
patch_all()
def lambda_handler(event, context):
tasks = []
dict_to_populate = {}
for item in list:
tasks.append(asyncio.ensure_future(do_work(item, dict_to_populate)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close
async def do_work(item, dict_to_populate):
#assume regions are obtained
for region in regions:
response_vpcs = describe_vpcs(obj['Id'], session_assumed, region)
if 'Vpcs' in response_vpcs:
for vpc in response_vpcs['Vpcs']:
#process
我希望看到 do_work 功能基本同时(异步)启动,但根据 XRAY,它们都是同步的。它正在同步处理并按预期填充 dict_to_populate。
- 这就是我在 aws lambda 中所做的,我想做 4 post 请求,然后收集所有响应。希望这可以帮助。
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
方法中,这就是我使用 wait with 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 会话
完成 post 的方式
async with session.post(pds_url,
data=populated_template_payload,
headers=PDS_HEADERS,
ssl=ssl_context) as response:
status_code = response.status
我正在尝试创建一个 python3.7 lambda,它正确地使用 asyncio 进行线程处理。
我尝试了许多不同的代码变体,但这是最新的块。我正在使用 AWS Xray 查看时间,很容易验证异步是否正常工作。所有这些任务和调用都是同步完成的。
import json
import boto3
import asyncio
from botocore.exceptions import ClientError
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
#xray
patch_all()
def lambda_handler(event, context):
tasks = []
dict_to_populate = {}
for item in list:
tasks.append(asyncio.ensure_future(do_work(item, dict_to_populate)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close
async def do_work(item, dict_to_populate):
#assume regions are obtained
for region in regions:
response_vpcs = describe_vpcs(obj['Id'], session_assumed, region)
if 'Vpcs' in response_vpcs:
for vpc in response_vpcs['Vpcs']:
#process
我希望看到 do_work 功能基本同时(异步)启动,但根据 XRAY,它们都是同步的。它正在同步处理并按预期填充 dict_to_populate。
- 这就是我在 aws lambda 中所做的,我想做 4 post 请求,然后收集所有响应。希望这可以帮助。
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
方法中,这就是我使用 wait with 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 会话
async with session.post(pds_url,
data=populated_template_payload,
headers=PDS_HEADERS,
ssl=ssl_context) as response:
status_code = response.status