Как скачать статистику игроков World of Tanks за одну ночь / Павел Пересторонин
Как при помощи Requests, Asyncio и Aiohttp перестать использовать многопоточный код? На примере Wargaming Public API Павел покажет, как однопоточный асинхронный код может оказаться эффективнее в исполнении и проще в отладке, чем наивный многопоточный.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
17. Еще ничего не ускорили
Но у нас уже есть конкурентный однопоточный код, который
поддерживает одновременное ожидание нескольких запросов.
17
18. Нужно больше запросов
pending = set()
for account_ids in chop(range(start_id, end_id + 1), 100):
pending.add(asyncio.async(api.account_tanks(account_ids)))
if len(pending) < max_pending_count :
continue
done, pending = yield from asyncio.wait (
pending, return_when= asyncio.FIRST_COMPLETED)
# TODO: done.result()
01.
02.
03.
04.
05.
06.
07.
08.
18
19. Нужно больше запросов
Теперь на каждой итерации можно подстраивать число запросов в
очереди.
Например, подсчитывая число ошибок REQUEST_LIMIT_EXCEEDED .
19
20. Зачем это всё?
• Хорошо отлаживается
• Не нужно думать про синхронизацию
• Работает быстрее
20
21. Занимательная статистика
• 14 часов
• Последний ID на RU-регионе: 40 751 344
• 19 905 151 игроков
• 632 538 123 танков
• 31.8 танков в среднем на аккаунт
• Дамп уместился в 2752.5MiB .
• 145B на аккаунт. 4.6B на танк.
21