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())
(В настоящее время каждый символ в длинной строке рассматривается как строка!)