Как стать автором
Обновить

Комментарии 9

Пока у нас вся 1000 запросов не выполнится, остальная программа будет заблокирована. Для решения этой проблемы создали неблокирующие библиотеки. Примером неблокирующей библиотеки является aiohttp, которая также умеет отправлять веб-запросы.

Полнейшая чушь. Я могу спокойно в многопоточном режиме отправить 1000 запросов в тред пул и дальше юзать программу не дожидаясь окончания выполнения запросов. При этом разницы в скорости по сравнению с asyncio никакой не будет

Для решения этой проблемы создали неблокирующие библиотеки. Примером неблокирующей библиотеки является aiohttp, которая также умеет отправлять веб-запросы.

Эти библиотеки были созданы неблокирующими в контексте использования эвент лупа, но это вовсе не значит что многопоточный код будет "блокирующим"

  • если в программе необходимо выполнить одновременно множество запросов – то мы используем aiohttp (или другую неблокирующую библиотеку).

Короче простите, но этот вывод полная хрень. Автору было бы неплохо сначала разобраться в различии многопоточности и асинхронности прежде чем делать такие заявления

 Единственнаяпроблема данного сайта в том, что при выводе картинок здесь отсутствуетпагинация страниц, а новые картинки появляются при прокрутке ленты. Тем неменее 25 картинок без прокрутки мы имеем. Чуть позже в статье я расскажу, какочень хитро обойти это ограничение.

Хочу так же обратить внимание что автор занимается изобретением велосипедов. Вместо того чтобы вытащить, например, через консоль разработчика API запрос с нормальным JSON-ответом, как отсюда

https://api.flickr.com/services/rest?sort=relevance&parse_tags=1&extras=url_q,url_t,url_s,url_n,url_w,url_m,url_z,url_c,url_l&per_page=100&page=3&lang=en-US&text=sea&viewerNSID=&method=flickr.photos.search&csrf=&api_key=50bb125c6abd4d90c7bcc8e932bcaf6b&format=json&hermes=1&hermesClient=1&reqId=b9aa4e84-74a4-4a18-8f46-256b42a74b54&nojsoncallback=1


он начинает парсить HTML-страницу с помощью bs. Думаю не стоит говорить о том, что это снижает скорость работы в разы

А еще автор любитель поговнокодить и применить антипаттерны.

Например

async def get_html(self) -> None:
Метод, начинающийся с get_ ничего не возвращает

with open(f'{self.save_path}/{pic_file}.jpg', 'wb') as file:

Чтобы складывать пути есть os.path.join или Pathlib


Полнейшая чушь. Я могу спокойно в многопоточном режиме отправить 1000 запросов в тред пул и дальше юзать программу не дожидаясь окончания выполнения запросов. При этом разницы в скорости по сравнению с asyncio никакой не будет.

А в чем чушь полнейшая, если по вашим словам "разницы в скорости по сравнению с asyncio никакой не будет"? Это просто 2 разных подхода для решения одной и той же задачи

Короче простите, но этот вывод полная хрень. Автору было бы неплохо сначала разобраться в различии многопоточности и асинхронности прежде чем делать такие заявления

Здесь больше эмоций, чем аргументированной критики. В моём заявлении нет ничего, что противоречило бы правильной реализации поставленной задачи

Вместо того чтобы вытащить, например, через консоль разработчика API запрос с нормальным JSON-ответом

Конкретно для этого примера можно так сделать. Но представте, что у нас на сайт не предоставляет API. Я описал универсальный подход.

А еще автор любитель поговнокодить и применить антипаттерны.

Все мы иногда любители этого. По поводу говнокода, я процитирую одного своего товарища, который толи в шутку, толи в заправду говорил: "Говнокод очень сильно ускоряет коммерческую разработку".

Я написал это приложение в своё удовольствие, никакой коммерческой составляющей здесь и в помине нет. Здесь просто показано одно из множества решений данной проблемы. Эффективное оно или нет - вы решаете сами для себя.

А теперь от меня вопрос:

Интерестно, у вас на работе такая же корпоративная культура? Тогда я вам сочувствую

А в чем чушь полнейшая, если по вашим словам "разницы в скорости по сравнению с asyncio никакой не будет"? Это просто 2 разных подхода для решения одной и той же задачи

Верно, но вы то в статьте пишете о том, что в многопоточном исполнении

Пока у нас вся 1000 запросов не выполнится, остальная программа будет заблокирована.

А это неверно. С чего она будет заблокирована? Есть основной поток с tkinter и есть остальные потоки с отправкой запросов. И почему основной поток будет блокироваться?

Интерестно, у вас на работе такая же корпоративная культура?

Какая такая? Код-ревью это вообще не про корпоративную культуру

Верно, но вы то в статьте пишете о том, что в многопоточном исполнении

Похоже вы не поняли для чего я это сделал: вы не заметили, что при выполнении запросов плавно меняется progress bar. При нажатии кнопки "Начать" мы будем с  помощью aiohttp отправлять запросы с  максимальной скоростью. Пока картинки скачиваются, мы можем отправлять команды обновления progress bar хода выполнения из цикла событий asyncio в цикл событий Tkinter.
Очень интересно посмотреть как вы сделаете отзывчивый UI через пул процессов?

А это неверно. С чего она будет заблокирована? Есть основной поток с tkinter и есть остальные потоки с отправкой запросов. И почему основной поток будет блокироваться?

Это вы вырвали из контекста статьи. Это было написано ДО того, как я заговорил о многопоточности. Т.е. если реализовать длительную блокирующую операцию в mainloop(), то программа "застынет" и ОС подумает, что она зависла. Если реализовать длительную блокирующую операцию в дополнительнм потоке - то он застынет на время выполнения операции, а главный поток будет нормально работать. Вы даже статью нормально прочитать не смогли, вам главное кое-что на вентилятор побыстрее накинуть

Какая такая? Код-ревью это вообще не про корпоративную культуру

Вы на Pull request такие же комментарии оставляете: "Зачем ты изобретаешь велоспед", "Хватит говнокодить"?

Знаете есть одна хорошая книга у Роберта Саттона пр то, с кем не надо работать. Судя по вашему тону вы мне именно таким и представляетесь.

"Также создадим два дополнительных потока приложения, чтобы обойти глобальную блокировку интерпретатора Python."
Может я все проспал? Что за глобальная блокировка интерпретатора Python?

В tkinter имеется собственный цикл событий mainloop(), который блокирует главный поток. Это означает, что любая длительная операция может привести к заморозке пользовательского интерфейса.
Избежать проблемы можно через выполнение функций, которые не блокируют этот цикл событий. Это достигается тем, что исполнение цикла событий в asyncio надо делать в отдельном потоке.
Про глобальную блокировку интерпритатора GIL на Хабре написан не один десяток статей.

Теперь понятно про что вы. Я уже было подумал, что сам язык стали блокировать и писать на нем приложения ))

Спасибо за такую подробную статью!

Спасибо за комментарий. Я привел только один из способов реализации. Другой способ - в самом первом комментарии

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории