Стоит заметить, что тут не совсем корректное использование библиотеки aiohttp. Из документации: Don’t create a session per request. Most likely you need a session per application which performs all requests altogether. ... Anyway making a session for every request is a very bad idea. Создавая каждый раз новую ClientSession в функции download_image ты каждый раз создаешь connection pool и прочие связанные с сессией ресурсы. Это довольно накладно. Корректнее в main'e создать контекст сессии и уже саму сессию передавать в download_image. async def main(): async with aiohttp.ClientSession() as session: image_tasks = [] for image_num in range(IMAGES_COUNT): image_tasks.append(asyncio.create_task(download_image(session, image_num))) # ...... # и поправить download_image async def download_image(session, image_num): async with session.get(SITE, proxy=None) as response: # ...... Ну и в синхронном варианте стоит сделать подобное, requests также дает сессию как контекст мэнеджер. Просто это уже не одну строчку, поэтому и док-ии не на самом видном месте. Н-р: with requests.Session() as session: response = session.get('some.site')
Скажите пожалуйста сколько времени вы тратите на изучение нового фреймворка? Как проходит обычно этот процес? Вам надо поработать, быт, полистать соцсети о новых технологиях, время на ютуб канал. Я иногда ахреневаю от количества информации и подтем когда читаю статью по фреймворку, смотрю видео, читаю документацию.
На самом деле у меня намного больше задач, не учитывая те, которые вы перечислили. Если дело касается библиотеки, то как правило на то, чтобы понять как она работает, может уйти от одного дня, до нескольких дней. Бывает такое что сразу понимаю как она работает и просто по документации делаю нужные мне действия. Если речь о фреймворках, то тут как правило нужно много времени. Я просто изучаю и прорабатываю по несколько тем в день, и так спустя какое-то время удается его до конца посмотреть. Стоит добавить, что чем больше вы программируете, тем быстрее проходит процесс обучения.
я если че не хейчу.)) просто отмечаю что на мой взгляд было бы тоже полезно знать. с уважением.)) у асинхронности есть огромные недостатки, как и у синхронности. лучше сразу определиться где что надо а не брать ибо оно быстрее. отстрелите не только ноги но и голову по итогу..😂 не стоит везде пихать асинхронность, ибо это ошибка!!! я бы сюда добавил еще видос о проблемах асинхронности чтоб потом новички и не только не по отстреливали себе все и вся.🤣 асинхронность не всегда быстрее!!! оно все под разные задачи! не путайте горячее с холодным.)) горячее не лучше холодного. оно лучше в определенны момент. так и тут. за видео спасибо!)
Недавно писал асинхронный парсер с многозадачностью.. По началу та ещё головная боль 😅 Но вышло неплохо) Сделал автопарсинг нескольких сайтов за минуты (синхронно это бы заняло немало дней, а может и недель..) Самое сложное было сделать баланс между кол-вом процессов для многозадачности и объёмом данных на задачу, как хорошо что в asyncio уже всё для этого есть) Правда я поздновато узнал про asyncio queue 😅, но в принципе без него получилось тоже хорошо (процессы просто заполняли список и после всей работы включая каждый распараллеленый запрос всё записывал в csv)
ну да, прям таки дней) если асинхронно несколько минут, то без асинхронности максимум +15 минут. И то, больше шанс, что забанят за большое количество запросов.
А можно видос про парсинг для cms например на.. php? Просто часто бывает что в проектах приходится работать с ajax (например автоимпорт csv каждое n-е время) и др. фреймворками с которыми уже непросто работать обычными способами 😅 Или можете подсказать как отобразить некоторые запросы ajax которые невидно в инспекторе? (Сохранение лога пробовал..)
Круто. Есть даже ответ по прокси в асинхронном подходе. А если прокси socks5 ? А если прокси с авторизацией? А если это ipv6 и с ротвцией? - точно была с этим проблема, сервис дал на вход прокси вида ipv4 и их добавлять в скрипт, все работало с протоколом http, а вот на socks5 полная беда и только ошибки. Если нужно, укажу сервис и примеры какие были прокси, очень дешего и доступно.
@@zproger Их мало. Очень мало. Но была задача, именно ipv6 с ротацией по ссылке спасли. Очень дёшево вышло. Да и вопрос к selenium прокси с авторизацией - какие только гайды не смотрел - однозначно работающего решения нет. Все с косяками.
Можно ли считать ддосом, если я в функции пишу цикл, в цикле делаю requests на сайт, а после, несколько десятков потоков этой функции врубаю. Считается?
А если сделать все тоже в пачке тредов результат будет тот же, ну по скорости? Например, я не знаю какой список URL нужно проверить. То есть знаю 1-5 штук, потом мне из очереди приходит еще куча URL-ов. Мне нужен типа воркер, что будет добавлять столько тредов, сколько нужно, то есть иногда 1 качается файл иногда 50 одновременно. Может проще обернуть requests в Thread и тогда уже делать это просто созданием новых Thread?
Можно создать отдельную функцию которая будет создавать асинхронные задания. Потоки блокируются и это будет медленно, если уже делать подобное, то с multiprocessing.
@@zproger Но multiprocessing будет тормозить если у меня задач 100 отдовременно, а ядер 8. Я думал, что эти все io модули, что ты показываешь, внутри реализованы типа как ThreadPool. Только использовать их удобнее, так как они сделаны типа как лямбда функция, оно не именованое, вешаешь коллбек на то, что делать по завершении скачивания/выгрузки и т.д. А если у меня система более сложная, например есть куча разных задач, одни скачивают файлы другие делают иной ввод/вывод, но именно эти задачи лучше всего делать в отдельных Thread как ты в видео про Thread и говорил. Так вот, если у меныя один обработчик очереди задач которые должны запускаться в треде, типа как оболочка и он получает входные данные и стартует треды со стандартными либами внутри типа requests, то есть чтобы я не парился однопоточная либа или нет, чтобы оболочка решала помещать ее в отдельный процесс или тред, чтобы выполнить асинхронно или вообще синхронно выполнить. Или в другом прикол, что пайтон не может перехватить управление использования тредов, так как либа сишная и если она использует поток то один свой собственный и если пайтон пытаться треды создавать то она(ну к примеру requests) их просто будет лепить в какую-то очередь внутри своего какого-то потока и все? То есть проблема самой либы. Я не мойму просто почему ты рекомендуешь это делать отдельным процессом, если такой тип задач io может выполняться в тредах и даст прирост для количества тредов большего чем оптимальное кличество процессов для multiprocessing? Или может можно, но надо использовать слово asynk правильно, хз...
Видео хорошее, но выпрашивание лайков не нравится. Человек не будет нажимать лайк и ждать пока выйдет другое видео, проще на другом канале найти нужную инфу. Так не проще сделать сразу качественны контент без прибенения, чтобы люди сразу находили его?
Материал супер! НО текст программы и так мало умещается в IDE, так и IDE еще не на полный экран развернута. Читать не очень удобно. По факту где то 30-40% текст программы, и остальное это IDE, рабочий стол и панель управления, что по факту мало участвует в теме урока.
меня одного смутило что тут не показано сколько занимает времени в среднем скачивание для 1 картинки? Ведь по идее тут должен выигрывать синхронный подход тк не нужно создавать корутину.
При синхронном подходе интерпретатор будет блокироваться при выполнении каждого запроса, а это бутылочное горлышко. При асинхронном, пока поток ожидает ответа от сервера, интерпретатор будет заниматься другими задачами. Очевидно, что создание корутины быстрее, чем ожидание данных от удаленного сервера. Я бы вообще в отдельном процессе занимался записью данных (сохранением картинок), не блокируя этим потоки, но с ssd, мне кажется, это не сильно накладно по времени
Да, я снимал раньше о grequests, но стоит признаться что эти инструменты совершенно разные, и в зависимости от задачи нужно выбирать определенный инструмент, иногда лучше grequests, а иногда aiohttp.
Ты уже делал урок по grequest, и там так же обсирал синхронный код. И даже есть курс целлых по параллейному программированию! Почему бы не сравнить, схожие технологии, aiohttp, grequest, multiproccesing, treading!? Ну и сразу рассказать о подводных камнях что не было в прошлых видео.
Давайте наберем 1000 лайков и я сделаю видео о aiofiles.
Возможно покажу похожие модули и их функционал.
1000 👍
Стоит заметить, что тут не совсем корректное использование библиотеки aiohttp.
Из документации:
Don’t create a session per request. Most likely you need a session per application which performs all requests altogether.
... Anyway making a session for every request is a very bad idea.
Создавая каждый раз новую ClientSession в функции download_image ты каждый раз создаешь connection pool и прочие связанные с сессией ресурсы. Это довольно накладно.
Корректнее в main'e создать контекст сессии и уже саму сессию передавать в download_image.
async def main():
async with aiohttp.ClientSession() as session:
image_tasks = []
for image_num in range(IMAGES_COUNT):
image_tasks.append(asyncio.create_task(download_image(session, image_num)))
# ......
# и поправить download_image
async def download_image(session, image_num):
async with session.get(SITE, proxy=None) as response:
# ......
Ну и в синхронном варианте стоит сделать подобное, requests также дает сессию как контекст мэнеджер. Просто это уже не одну строчку, поэтому и док-ии не на самом видном месте. Н-р:
with requests.Session() as session:
response = session.get('some.site')
Только этим вечером сидел, изучал асинхронность и тут вижу в недавних это видео)
Спасибо за ролик!
ХА, мой палец вверх был тысячным! Ждем видос про aiofiles)
Очень хорошое видео) Делайте почаще такие видео) Однозначно лайк! ❤
Спасибо за видео. Отличная подача материала. Хотелось бы больше про асинхронное программирование
As a Mexican dev I don't know how I ended here but I'll sub hahaha
:D
Вот это мы смотрим, вот это мы лайкаем :D
Скажите пожалуйста сколько времени вы тратите на изучение нового фреймворка? Как проходит обычно этот процес? Вам надо поработать, быт, полистать соцсети о новых технологиях, время на ютуб канал. Я иногда ахреневаю от количества информации и подтем когда читаю статью по фреймворку, смотрю видео, читаю документацию.
На самом деле у меня намного больше задач, не учитывая те, которые вы перечислили. Если дело касается библиотеки, то как правило на то, чтобы понять как она работает, может уйти от одного дня, до нескольких дней. Бывает такое что сразу понимаю как она работает и просто по документации делаю нужные мне действия.
Если речь о фреймворках, то тут как правило нужно много времени. Я просто изучаю и прорабатываю по несколько тем в день, и так спустя какое-то время удается его до конца посмотреть. Стоит добавить, что чем больше вы программируете, тем быстрее проходит процесс обучения.
@@zproger Расскажи про rootkit для Python
я если че не хейчу.)) просто отмечаю что на мой взгляд было бы тоже полезно знать. с уважением.))
у асинхронности есть огромные недостатки, как и у синхронности. лучше сразу определиться где что надо а не брать ибо оно быстрее. отстрелите не только ноги но и голову по итогу..😂 не стоит везде пихать асинхронность, ибо это ошибка!!! я бы сюда добавил еще видос о проблемах асинхронности чтоб потом новички и не только не по отстреливали себе все и вся.🤣 асинхронность не всегда быстрее!!! оно все под разные задачи! не путайте горячее с холодным.)) горячее не лучше холодного. оно лучше в определенны момент. так и тут.
за видео спасибо!)
Недавно писал асинхронный парсер с многозадачностью.. По началу та ещё головная боль 😅
Но вышло неплохо) Сделал автопарсинг нескольких сайтов за минуты (синхронно это бы заняло немало дней, а может и недель..)
Самое сложное было сделать баланс между кол-вом процессов для многозадачности и объёмом данных на задачу, как хорошо что в asyncio уже всё для этого есть)
Правда я поздновато узнал про asyncio queue 😅, но в принципе без него получилось тоже хорошо (процессы просто заполняли список и после всей работы включая каждый распараллеленый запрос всё записывал в csv)
ну да, прям таки дней) если асинхронно несколько минут, то без асинхронности максимум +15 минут. И то, больше шанс, что забанят за большое количество запросов.
теперь в потоках попробуй запускать асинхронные задачи
А как же видео про aiofiles? Уже 2к+ лайков))
Asyncio вообще рулит. Но иногда приходится подключать multiprocessing...
Zproger на какой ОС ты сидишь?
А можно видос про парсинг для cms например на.. php?
Просто часто бывает что в проектах приходится работать с ajax (например автоимпорт csv каждое n-е время) и др. фреймворками с которыми уже непросто работать обычными способами 😅
Или можете подсказать как отобразить некоторые запросы ajax которые невидно в инспекторе? (Сохранение лога пробовал..)
Круто.
Есть даже ответ по прокси в асинхронном подходе.
А если прокси socks5 ?
А если прокси с авторизацией?
А если это ipv6 и с ротвцией? - точно была с этим проблема, сервис дал на вход прокси вида ipv4 и их добавлять в скрипт, все работало с протоколом http, а вот на socks5 полная беда и только ошибки.
Если нужно, укажу сервис и примеры какие были прокси, очень дешего и доступно.
socks5 нужно по-другому подключать, возможно сделаю статью в телеграмм канале, либо полноценное видео
@@zproger
И socks5 для ipv6 очень нужно, с ротацией.
Иногда можно экономить на этом чуть ли не в 10 раз.
Далеко не все сайты поддерживают IPv6
@@zproger
Их мало.
Очень мало.
Но была задача, именно ipv6 с ротацией по ссылке спасли.
Очень дёшево вышло.
Да и вопрос к selenium прокси с авторизацией - какие только гайды не смотрел - однозначно работающего решения нет. Все с косяками.
Можно ли считать ддосом, если я в функции пишу цикл, в цикле делаю requests на сайт, а после, несколько десятков потоков этой функции врубаю. Считается?
ну типа, только скорее всего упрешься в ограничение запросов на сайте и ничего не вернет тебе, либо будешь ждать респонсы по мере снятия ограничения
А если сделать все тоже в пачке тредов результат будет тот же, ну по скорости?
Например, я не знаю какой список URL нужно проверить. То есть знаю 1-5 штук, потом мне из очереди приходит еще куча URL-ов. Мне нужен типа воркер, что будет добавлять столько тредов, сколько нужно, то есть иногда 1 качается файл иногда 50 одновременно. Может проще обернуть requests в Thread и тогда уже делать это просто созданием новых Thread?
Можно создать отдельную функцию которая будет создавать асинхронные задания. Потоки блокируются и это будет медленно, если уже делать подобное, то с multiprocessing.
@@zproger Но multiprocessing будет тормозить если у меня задач 100 отдовременно, а ядер 8. Я думал, что эти все io модули, что ты показываешь, внутри реализованы типа как ThreadPool. Только использовать их удобнее, так как они сделаны типа как лямбда функция, оно не именованое, вешаешь коллбек на то, что делать по завершении скачивания/выгрузки и т.д. А если у меня система более сложная, например есть куча разных задач, одни скачивают файлы другие делают иной ввод/вывод, но именно эти задачи лучше всего делать в отдельных Thread как ты в видео про Thread и говорил. Так вот, если у меныя один обработчик очереди задач которые должны запускаться в треде, типа как оболочка и он получает входные данные и стартует треды со стандартными либами внутри типа requests, то есть чтобы я не парился однопоточная либа или нет, чтобы оболочка решала помещать ее в отдельный процесс или тред, чтобы выполнить асинхронно или вообще синхронно выполнить.
Или в другом прикол, что пайтон не может перехватить управление использования тредов, так как либа сишная и если она использует поток то один свой собственный и если пайтон пытаться треды создавать то она(ну к примеру requests) их просто будет лепить в какую-то очередь внутри своего какого-то потока и все? То есть проблема самой либы. Я не мойму просто почему ты рекомендуешь это делать отдельным процессом, если такой тип задач io может выполняться в тредах и даст прирост для количества тредов большего чем оптимальное кличество процессов для multiprocessing?
Или может можно, но надо использовать слово asynk правильно, хз...
ВОПРОС.
Зачем вы импортируете perf_counter из модуля time (0:50), если раньше вы уже импортировали весь модуль time?
ой, не заметил
Повторил весь код, с асинхронной версией и у меня приложение скачивает 50 одинаковых картинок. Что я сделал не так?
а что насчет httpx?
Я сделал телеграмм бота используя aiogram, этот бот использует апи чатгпт. Была бы разница если бы я написал этого бота на telebot?
with aiofiles - это псевдо асинхронность? не существует асинхронной записи в файл?
В любой нормальной ОС имеется асинхронная запись в файл.
Сделай видео о post-запросах, их мало на Ютубе
в качестве payload'а обычный словарь с нужными данными, а потом requests.post(url, data=payload)
Видео хорошее, но выпрашивание лайков не нравится. Человек не будет нажимать лайк и ждать пока выйдет другое видео, проще на другом канале найти нужную инфу. Так не проще сделать сразу качественны контент без прибенения, чтобы люди сразу находили его?
Материал супер! НО текст программы и так мало умещается в IDE, так и IDE еще не на полный экран развернута. Читать не очень удобно. По факту где то 30-40% текст программы, и остальное это IDE, рабочий стол и панель управления, что по факту мало участвует в теме урока.
меня одного смутило что тут не показано сколько занимает времени в среднем скачивание для 1 картинки? Ведь по идее тут должен выигрывать синхронный подход тк не нужно создавать корутину.
При синхронном подходе интерпретатор будет блокироваться при выполнении каждого запроса, а это бутылочное горлышко. При асинхронном, пока поток ожидает ответа от сервера, интерпретатор будет заниматься другими задачами. Очевидно, что создание корутины быстрее, чем ожидание данных от удаленного сервера. Я бы вообще в отдельном процессе занимался записью данных (сохранением картинок), не блокируя этим потоки, но с ssd, мне кажется, это не сильно накладно по времени
А, ну и aiofiles используется, так что не нужен отдельный процесс
А что за браузер такой, в котором сразу видно какой ответ будет на запрос?
Какое-то расширение для мозилы?
Тыща лайков есть, а проды нет :(
Там с этой либой появилось много подводных камней, до сих пор не придумал как их решить и заснять это видео
А как бы ты делал, если надо было всё в один файл писать?
Классы.
И внутри методы запуска.
что за тема в vscode?
Зачем это видео было снято, если есть grequests?
Да, я снимал раньше о grequests, но стоит признаться что эти инструменты совершенно разные, и в зависимости от задачи нужно выбирать определенный инструмент, иногда лучше grequests, а иногда aiohttp.
Можно пример кейса когда grequests лучше?
зачем прокси использовать?
в чем проблема запустить на отдельном потоке?
в Python от потоков толку 0, если запустить 100 потоков, это будет выполняться медленней, чем на 1 потоке
GIL
Можно сравнить Qrequests с Aiohttp?
Изменено: я второй
Думаю да, возможно сделаю видео
ууу я первый
=)
Лайк ставь ск
Ты уже делал урок по grequest, и там так же обсирал синхронный код. И даже есть курс целлых по параллейному программированию! Почему бы не сравнить, схожие технологии, aiohttp, grequest, multiproccesing, treading!? Ну и сразу рассказать о подводных камнях что не было в прошлых видео.
C каких пор асинхронность стала приравниваться к потокам?!
Что за дестрибутив у тебя?
ZorinOS
было видео токо и слышу хрень ету... не чего не понятно , я вшоке..начало смотрю интересно .а дальше слышу было видео и т д ..
седьмой
😎
927
928
Уважаемый автор, было преступно не вспомнить за grequests, а использовать только requests. Хотя бы просто сказали за такую либу.
про него будет отдельное видео, потом сравним aiohttp и grequests
@@zproger nice
Ensure_future, юзай для асинцио.
Ускорит