В чем недостаток многократного запуска asyncio.run в Python коде? - PullRequest
1 голос
/ 21 февраля 2020

Я хотел бы добавить асин * c код в мой проект Python, чтобы сделать часть запроса http асинхронной. например, я читаю параметры из Kafka, использую эти параметры для генерации некоторых URL-адресов и помещаю их в список. если длина списка больше 1000, то я отправляю этот список в aiohttp для пакетного получения ответа.

Я не могу изменить весь проект с syn c на asyn c, поэтому я может изменить только часть http-запроса.

пример кода:


async def async_request(url):
    async with aiohttp.ClientSession() as client:
        resp = await client.get(url)
        result = await resp.json()
        return result

async def do_batch_request(url_list, result):
    task_list = []
    for url in url_list:
        task = asyncio.create_task(async_request(url))
        task_list.append(task)
    batch_response = asyncio.gather(*task_list)
    result.extend(batch_response)

def batch_request(url_list):
    batch_response = []
    asyncio.run(do_batch_request(url_list, batch_response))
    return batch_response

url_list = []
for msg in kafka_consumer:
    url = msg['url']
    url_list.append(url)
    if len(url_list) >= 1000:
        batch_response = batch_request(url_list)
        parse(batch_response)
        ....

Как мы знаем, asyncio.run создаст четный l oop для запуска асинхронной c функции, а затем закройте четное l oop. Моя проблема в том, повлияет ли мой метод на производительность кода asyn c? А у тебя есть какой-нибудь способ лучше для моей ситуации?

1 Ответ

0 голосов
/ 21 февраля 2020

Нет серьезных проблем с вашим подходом, и вы получите преимущество в скорости от asyncio. Единственная возможная проблема здесь в том, что если позже вы захотите сделать что-то асинхронное c в другом месте кода, вы не сможете сделать это одновременно с batch_request.

Если вы не хотите менять весь проект с syn c на asyn c, но если в будущем вам захочется запустить batch_request параллельно с чем-то, имейте в виду, что вы может запустить его в потоке и асинхронно ждать результата.

...