Python асинхронная CancelledError () без подробностей - PullRequest
1 голос
/ 08 мая 2019

Сбой следующего кода, и я не могу получить фактическую ошибку, я просто получаю многочисленные сообщения CancelledError

import aiobotocore, asyncio

async def replicate_to_region(chunks, region):
    session = aiobotocore.get_session()
    client = session.create_client('dynamodb', region_name=region)
    start = 0
    while True:
        chunk = chunks[start]
        item = {'my_table': chunk}
        response = await client.batch_write_item(RequestItems=item)

async def main():
    asyncio.gather(*(replicate_to_region(payloads, region) for region in regions))

asyncio.run(main())

Я получаю следующие ошибки;

client_session: <aiohttp.client.ClientSession object at 0x7f6fb65a34a8>
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f6fb64c82b0>
_GatheringFuture exception was never retrieved
future: <_GatheringFuture finished exception=CancelledError()>
concurrent.futures._base.CancelledError
_GatheringFuture exception was never retrieved
future: <_GatheringFuture finished exception=CancelledError()>

Я пробовал довольно много вариантов функции replicate_to_region, но все они терпят неудачу с одной и той же ошибкой, описанной выше. Было бы полезно просто увидеть, что является настоящей ошибкой.

1 Ответ

1 голос
/ 10 мая 2019
async def main():
    asyncio.gather(...)

asyncio.gather () само по себе ожидаемое:

ожидаемое asyncio.gather (* aws, loop = None, return_exceptions= Неверно)

Это означает, что вы должны использовать await при работе с ним:

async def main():
    await asyncio.gather(*(replicate_to_region(payloads, region) for region in regions))

не по теме:

Я не работалс aiobotocore и не уверен, что это важно, но лучше сделать так, как написано в документации.В частности, вы, вероятно, должны использовать async with при создании клиента , как показано в примере .

...