Python Asyncio с difflib замедляет ползти

У меня есть скрипт, который асинхронно загружает несколько URL-адресов, а затем постоянно отслеживает их изменения с помощью difflib

import asyncio
import difflib
import aiohttp

urls = ['http://www.nytimes.com/',
        'http://www.time.com/',
        'http://www.economist.com/']

async def get_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            old = await resp.text()
            print('Initial -',url)
        while True:
            async with session.get(url) as resp1:
                new = await resp.text()
            print('Got -',url)
            diff = difflib.unified_diff(old, new)

            for line in diff:
                print(line)
            old = new

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    ops = []
    for url in urls:
        ops.append(get_url(url))
    loop.run_until_complete(asyncio.wait(ops))

Когда я запускаю его со следующими комментариями

        for line in diff:
            print(line)

Сценарий запускается, как и ожидалось, получая каждый URL около 3 раз в секунду.

Когда строки не закомментированы, сценарий замедляется, намного медленнее, чем если бы поиск выполнялся последовательно.

Я понятия не имею, почему это происходит, имеет ли это отношение к difflib, возвращающему генератор?

1 ответ

Во-первых, у вас есть ошибка в вашем коде, а не new = await resp.text() так должно быть new = await resp1.text(),

unified_diff работает со списком строк, а не напрямую со строками. Ты можешь использовать splitlines() чтобы быстро разбить строку на строки:

diff = difflib.unified_diff(old.splitlines(), new.splitlines())

(В настоящее время каждый символ в длинной строке рассматривается как строка!)

Другие вопросы по тегам