Немедленная обработка асинхронных ответов

Мне нужно многократно анализировать содержимое одной ссылки. синхронный способ дает мне 2-3 ответа в секунду, мне нужно быстрее (да, я знаю, что слишком быстро тоже плохо)

Я нашел несколько асинхронных примеров, но все они показывают, как обрабатывать результат после парсинга всех ссылок, тогда как мне нужно парсить его сразу после получения, что-то вроде этого, но этот код не дает никакого улучшения скорости:

import aiohttp
import asyncio
import time
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    while True:
        async with aiohttp.ClientSession() as session:
            html = await fetch(session, 'https://example.com')
            print(time.time())
            #do_something_with_html(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

person vreter    schedule 01.01.2019    source источник
comment
2-3 слишком медленно, но и слишком быстро тоже плохо, что вы ищете?   -  person Chad    schedule 02.01.2019
comment
может быть 10-20 запросов в секунду   -  person vreter    schedule 02.01.2019
comment
Ответ на аналогичный вопрос здесь, в котором все еще используется asyncio: для одновременного запуска задач в asyncio"> stackoverflow.com/questions/54156503/   -  person dtanabe    schedule 13.01.2019


Ответы (2)


но этот код не дает никакого улучшения скорости

asyncio (и асинхронность/параллелизм в целом) обеспечивает повышение скорости операций ввода-вывода, которые чередуются друг с другом.

Когда все, что вы делаете, это await something, и вы никогда не создаете никаких параллельных задач (используя asyncio.create_task(), asyncio.ensure_future() и т. д.), то вы в основном занимаетесь классическим синхронным программированием :)

Итак, как сделать запросы быстрее:

import aiohttp
import asyncio
import time

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def check_link(session):
    html = await fetch(session, 'https://example.com')
    print(time.time())
    #do_something_with_html(html)

async def main():
    async with aiohttp.ClientSession() as session:
        while True:
            asyncio.create_task(check_link(session))
            await asyncio.sleep(0.05)

asyncio.run(main())

Примечание: чтобы это работало, async with aiohttp.Cliensession() as session: должен быть выше (снаружи) while True:. На самом деле, наличие одного ClientSession() для всех ваших запросов в любом случае является хорошей практикой.

person Messa    schedule 13.01.2019