Привет! Показываю на пальцах, в чём крутость асинхронного кода на Python и показываю, как с помощью него эффективно взаимодействовать с БД. Поддержать: / luchanos / @luchanos #ityoutubers #ityoutubersru
Спасибо, на этапе изучения асинхронности, которая сама по себе является очень сложно для понимания темой, вот такие прикладные ролики с примерами использования просто бесценны
Когда нужен был create table, а pyspark умеет только dml , нашел это изделие И получается, отправляю в базу один ddl запрос через асинхронную функцию, предназначенную для параллельной работы тьмы запросов Профит
Можно и блокирующий код запускать, для этого используется конструкция loop.run_in_executor(). Но вот написать не блокирующий код не используя await asyncio.sleep() и уже готовые библиотеки которые это поддерживают, это уже интересно.
А если не использовать асинхронную библиотеку для постгри и пытаться стандартной библиотекой psycopg2 выполнять запросы в функциях-корутинах завернутых в async + await asyncio.sleep(0.1). Не будет также по скорости? Вопрос в целом, почему нельзя использовать синхронную библиотеку для записи БД или чего-то ещё, если мы всё равно можем передать для async def xxx(). awaitable объект.
обычно такие вещи админы смотрят глазами. существует такой параметр, он называется утилизация. вот надо чтобы он + время ответа базы не превышало допустимые значения) постараюсь раскрыть тему)
странно получается) до 10 инсерта как-то в разнобой ID и cnt, потом нормально create table test (id serial not null, val text) QUERY = """INSERT INTO test (val) VALUES ($1)""" await db_pool.fetch(QUERY, 'test insert ' + str(cnt)) ID. VAL 1 test insert 2 2 test insert 4 3 test insert 1 4 test insert 7 5 test insert 3 6 test insert 6 7 test insert 8 8 test insert 5 9 test insert 9 10 test insert 10
это связано с тем, что вывод в консольку может долетать с разной скоростью от каждой таски) аналогично может получиться, что сначала в консольке будет Exception, а потом все остальное)
Интересно а если неизвестно заранее количество запросов? Получается если поставить длину 1, то он будет ждать пока не наберётся 200 и пользователю ничего не вернётся?
@@alexsur7315 я думаю что это всё будет в рамках проекта, по срокам точно не скажу сейчас. идея в том, что тот материал, который я тут осветил прикрутить на что-то "боевое". я уже купил домен и там есть сервер на котором будет web-app, которое мы будем покрывать всеми такими вот прелестями)
pended и не нужен, у него цикл х из 10_000, мог бы использовать х, что бы не добавлять лишние действия. Но это не важно, главное знания про асинхронность он донес
Здравствуйте. ищу решение. У меня такая проблема. Основной код асинхронный, и при определённом выполнении условия должен создаваться новый тред/поток, который должен жить уже дальше своей жизнью. Но к сожалению выходит так, что создаётся новый потом внутри асинхронке и он стопорит всё, пока не закончит свою работу. Уже месяца 2 ищу как мне создать новый поток, который бы зарождался в асинхронке и жил своей жизнью. Может у кого есть идеи? ПС. Пожалуйста не пишите, мол зачем тебе, сделай асинхронно вообще всё. Это не решение моей задачи. Мне нужный асинхронный парсинг в процессе работы которого, выполняется условие и стартует грубо говоря отдельная программа. И мне нужно, что бы это был именно новый поток. Ни и что бы совсем усложнить задачу, количество будущих потоков неизвестно (динамическое). Кто знает решение такой задачи. Отзовитесь ))
Бесполезное видео. Вы не даете конкретики во времени выполнения. Много всяких излишеств. Раз уж вы показываете gather, то следовало бы использовать comprehension, заполняемый корутинами.
ахиреть как быстро стало работать. столкнулся с проблемой асинхронности с ТГ ботом на aiogram не хочет работать просто так с sqlite а мне она идеально подходит +-. Ну и шаг назад два вперёд , сейчас буду повторять код.
круто нихера не понял где можно нормльно разобрать асинх у меня надо гет пост в панду сложить прилетит джсон после псот проверил методом раскидать по ядрам ну бустрее но ядра занимать не хочется # df['jsonreport'] = df.newbody.parallel_apply(self.apply_func) типо того на 4 быстрее чем просто апплай да ) но вот про асинхр пытаюсь понять как действовать ничига не понимаю(
Очень сильно понравилось, спасибо
Спасибо, на этапе изучения асинхронности, которая сама по себе является очень сложно для понимания темой, вот такие прикладные ролики с примерами использования просто бесценны
Очень доходчиво! Благодарю за труд!
отличный туториал,спасибо автор 👍
Спасибо за познавательный материал без воды👍
сколько твоих видосов не смотрю, каждый раз понимаю, что очень доступно объясняешь, респект
Спасибо за труд! Постепенно вхожу в сферу!)
Кайфанул!
Спустя 1,5 года разработки не расторопных сервисов, наконец то добрался до асинхрона. Спасибо!
Парень, спасибо большое ! Очень круто объяснил!
подписан на тебя где-то год, но когда нахожу такие старые видео у тебя - респект к каналу все больше растет)
отличный материал - спасибо!
Спасибо большое! очень доходчиво! а боялась, что не осилю асинхронность)
Большое спасибо за видеоурок
Спасибо! Очень помогло!
благодарю за отличную работу !
спасибо что смотрите!
Круто! До этого плохо понимал как работает asyncio, но теперь все понятно
дякую! змістовний приклад!
Асинхронка крутая тема👍 ждём новых выпусков про неё)
Полезная тема! Надо глубже.
спасибо! сделаем)
Когда нужен был create table, а pyspark умеет только dml , нашел это изделие
И получается, отправляю в базу один ddl запрос через асинхронную функцию, предназначенную для параллельной работы тьмы запросов
Профит
Спасибо! Понятно
Спасибо, было очень познавательно
благодарю!
отличное видео. красавец
Круто спасибо
И вам)
Отлично! Лайк и подписка!
спасибо! постараюсь радовать контентом!
Спасибо!!! Интересно, полезно, и вроде как вполне "взрослый" подход
Пересмотрел и спустя полгода понял что к чему)))
Да топчик
спасибо!
👍🏻
Очень круто, было бы прикольно осознать как запускать в фоне процесс без ожидания
процесс как python-процесс? не могли бы вы конкретизировать?
Хорошее видео) Есть только один вопрос - можно ли в chunk передать сразу все 10000 запросов? Как проверить это ограничение и что вообще будет?
Лайк! (по рекомендачии от канала джангоскул)
Можно и блокирующий код запускать, для этого используется конструкция loop.run_in_executor(). Но вот написать не блокирующий код не используя await asyncio.sleep() и уже готовые библиотеки которые это поддерживают, это уже интересно.
Офигеть год прошел)
4:39 наша лупа))
Ага и пупа)
Супер видео! Спасибо! Кстати, можно убрать искусственно тормозящий asyncio.sleep в конце и будет еще быстрее)
да! но это спецом было сделано)
А если не использовать асинхронную библиотеку для постгри и пытаться стандартной библиотекой psycopg2 выполнять запросы в функциях-корутинах завернутых в async + await asyncio.sleep(0.1). Не будет также по скорости? Вопрос в целом, почему нельзя использовать синхронную библиотеку для записи БД или чего-то ещё, если мы всё равно можем передать для async def xxx(). awaitable объект.
спасиюо за видео. сделай пожалуйста большой ,углубленный туториал реальным проектом по этой теме.
уже в разработке!) ждите анонс!)
В конце sleep забыл удалить
Не забыл, а оставил для имитации задержки сети, подключается же к локалхосту.
такой вопрос: в каком случае лучше использовать асинхронность, а в каком многопоточность, если обе штуки нужны для задач ввода-вывода?
@Ivan Petrov спасибо за развернутый ответ)
Интересно. Спасибо. НО БОЛЬШАЯ ПРОСЬБА не бить так сильно по клавишам!!! В наушниках очень не приятно слушать.
спасибо! я уже купил оборудование - будет ремастер старых роликов)
Еще бы как-нибудь создать код анализирующий нагрузку на БД и автоматом меняющий чанки на оптимальное значение. По теме - палец вверх
обычно такие вещи админы смотрят глазами. существует такой параметр, он называется утилизация. вот надо чтобы он + время ответа базы не превышало допустимые значения) постараюсь раскрыть тему)
странно получается) до 10 инсерта как-то в разнобой ID и cnt, потом нормально
create table test (id serial not null, val text)
QUERY = """INSERT INTO test (val) VALUES ($1)"""
await db_pool.fetch(QUERY, 'test insert ' + str(cnt))
ID. VAL
1 test insert 2
2 test insert 4
3 test insert 1
4 test insert 7
5 test insert 3
6 test insert 6
7 test insert 8
8 test insert 5
9 test insert 9
10 test insert 10
это связано с тем, что вывод в консольку может долетать с разной скоростью от каждой таски) аналогично может получиться, что сначала в консольке будет Exception, а потом все остальное)
Интересно а если неизвестно заранее количество запросов? Получается если поставить длину 1, то он будет ждать пока не наберётся 200 и пользователю ничего не вернётся?
абсолютно верно!) тут надо понимать какие риски мы несём и как с этим бороться. в ремейке этого ролика я покажу расширенный вариант)
@@luchanos спасибо. А когда ролик на этот счёт будет выпущен?
@@alexsur7315 я думаю что это всё будет в рамках проекта, по срокам точно не скажу сейчас. идея в том, что тот материал, который я тут осветил прикрутить на что-то "боевое". я уже купил домен и там есть сервер на котором будет web-app, которое мы будем покрывать всеми такими вот прелестями)
Классное видео, только "or pended == 10_000" никогда не исполнится(т.к. 9_999 будет последним в range )
хаха)) действительно)) спасибо!)
@@luchanos А сколько по умолчанию в пуле воркеров ? Можно его менять ... стоило упомянуть
pended и не нужен, у него цикл х из 10_000, мог бы использовать х, что бы не добавлять лишние действия. Но это не важно, главное знания про асинхронность он донес
tasks в середину цикла. Почему не показать пример с батч генератором.
хороший кейс, спасибо! покажу в переработанном материале)
Спешиал сенкс за отсылку к PEP 515 - Underscores in Numeric Literals. Забыл шо так можно.
Интересно, а зачем create_pool асинхронный?
Потому что подключение к базе тоже занимает время и может происходить с задержками
Здравствуйте.
ищу решение.
У меня такая проблема. Основной код асинхронный, и при определённом выполнении условия должен создаваться новый тред/поток, который должен жить уже дальше своей жизнью. Но к сожалению выходит так, что создаётся новый потом внутри асинхронке и он стопорит всё, пока не закончит свою работу.
Уже месяца 2 ищу как мне создать новый поток, который бы зарождался в асинхронке и жил своей жизнью. Может у кого есть идеи?
ПС. Пожалуйста не пишите, мол зачем тебе, сделай асинхронно вообще всё. Это не решение моей задачи. Мне нужный асинхронный парсинг в процессе работы которого, выполняется условие и стартует грубо говоря отдельная программа. И мне нужно, что бы это был именно новый поток.
Ни и что бы совсем усложнить задачу, количество будущих потоков неизвестно (динамическое).
Кто знает решение такой задачи. Отзовитесь ))
Уже неактуально (
забыл убрать await sleep(.1)
+++
Я экспериментировал с asyncio и библиотекой Jira. Не хотят они дружить(( У Вас нет не чего в этой теме?
Никогда не слышал про библиотеку Jira, надо будет поугглить
Бесполезное видео. Вы не даете конкретики во времени выполнения. Много всяких излишеств. Раз уж вы показываете gather, то следовало бы использовать comprehension, заполняемый корутинами.
Сделайте видео лучше, я приду и оценю с удовольствием))
ахиреть как быстро стало работать.
столкнулся с проблемой асинхронности с ТГ ботом на aiogram не хочет работать просто так с sqlite а мне она идеально подходит +-.
Ну и шаг назад два вперёд , сейчас буду повторять код.
круто нихера не понял где можно нормльно разобрать асинх у меня надо гет пост в панду сложить прилетит джсон после псот проверил методом раскидать по ядрам ну бустрее но ядра занимать не хочется
# df['jsonreport'] = df.newbody.parallel_apply(self.apply_func)
типо того на 4 быстрее чем просто апплай да ) но вот про асинхр пытаюсь понять как действовать ничига не понимаю(