Asyncio. Как добавить задачу в запущенный loop?

Здравствуйте, возникл один вопрос. Есть парсер, который вытаскивает информацию с нескольких сайтов. Возникает проблема в скорости загрузки этих данных, так как много ссылок, которые надо обработать. Из-за этого решил использовать asyncio и aiohttp. Так вот, вопрос в том, как мне сделать, чтобы этот парсер, допустим, отправлял по необходимости данные в asyncio, и он их обрабатывал. То есть, чтобы в этом допустим классе loop был запущен методом run_forever() и какая нибудь функция, которая добавляла task в loop. Реализуемо ли это? И правильно ли выбран подход? Заранее спасибо!
  • Вопрос задан
  • 1648 просмотров
Решения вопроса 1
MAKAPOH
@MAKAPOH
многостаночник
Если я правильно всё понял то вам должно хватить:

Идея следующая. Пишем корутину-исполнитель которая из очереди задач на скачивание берёт очередное задание, загружает что требуется, а результат кладёт в другую очередь результатов. С помощью вызова loop.create_task создаём несколько паралельно работающих корутин-исполнителей передав им как параметр очередь с задачами и очередь результатов. Пишем корутину-генератор задач, которая в соответствии с вашим алгоритмом будет наполнять очередь задачами. Как то так, к сожалению сейчас нет времени писать код.
По теме есть вот такой доклад - Patterns for asyncio applications там описаны несколько вариантов запуска циклов, в том числе в отдельном потоке как вам надо. Дерзайте :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
https://github.com/niklak/aiohttp_spider

и статью поищи где-то автор писал

а вообще - Scrapy упростил бы жизнь сильно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы