Оптимизация Django. 7 - Параллельные celery таски и их проблемы

  Рет қаралды 5,387

Senior Pomidor Developer

Senior Pomidor Developer

Күн бұрын

Пікірлер: 59
@Biongar
@Biongar Жыл бұрын
docker system prune -a -f, очистит все, кроме volumes, а посмотреть все можно чреез команду docker system df
@jArkee777
@jArkee777 Жыл бұрын
Спасибо большое, помогли очистить 3 гб памяти
@oooprya
@oooprya Жыл бұрын
Спасибо! Total reclaimed space: 16.67GB
@begula_chan
@begula_chan Жыл бұрын
Ох уж эти параллельные таски, с ними надо максимально аккуратно работать. Спасибо за еще одно чудесное видео!
@pylounge
@pylounge Жыл бұрын
Чтобы избежать копипаста в docker-compose можно использовать якоря (&) и ссылки (
@aleksei_bauman
@aleksei_bauman 9 ай бұрын
а можно пример?
@nikvityl
@nikvityl Жыл бұрын
Спасибо большое, Узнал много нового, долго игрался с тасками, не обновлялся прайс, но почему-то когда создал новую подписку в ней все работало. Удалил старые и в новых все хорошо работает, очень интерсесно.
@the_huge_knight
@the_huge_knight 6 ай бұрын
Можно в методе save() указать параметр update_fields в ф-ции set_price равный ('price', ) , в ф-ции set_comment равный ('comment', ). Тогда update в sql запросе не будет перезатирать все значения (можно чекнуть логи) объекта, а только указанные в update_fields. В данном случае эти 2 таски можно запустить параллельно.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 6 ай бұрын
Я просто взял этот кейс чтобы продемонстрировать проблему. В любом случае синглтон нужен , мы не можем всегда и везде это предусмотреть, особенно в немаленьких проектах
@alexey_all
@alexey_all Жыл бұрын
Удалить неиспользуемые образы: docker rmi $(docker images -q -f dangling=true) Удалить контейнеры: docker rm $(docker ps -a -q -f status=exited)
@shaxzodnizamov9773
@shaxzodnizamov9773 Жыл бұрын
Курс просто бомба !❤‍🔥
@ДосханСтыбаев-ц8щ
@ДосханСтыбаев-ц8щ Жыл бұрын
Большое спасибо, крутые видосы
@АртемИващенко-п2г
@АртемИващенко-п2г Жыл бұрын
как вариант, в таких не больших тасках, можно было бы просто использовать .save(update_fields=['comment'])
@АлександрИванов-ъ7р6ч
@АлександрИванов-ъ7р6ч Жыл бұрын
да, но поднятая проблема тоже актуальна, хотя ваше решение- снимает часть головной боли
@ramilelephant7826
@ramilelephant7826 Жыл бұрын
Уже жду следующий выпуск , как в сериале залип
@dodokwak
@dodokwak Жыл бұрын
Так много вкусного!
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
😁
@belevich_andrei
@belevich_andrei Жыл бұрын
Вероятно образы с именем 'None' создаются, когда мы делаем ребилд. Имя затирается, а старый образ становится None
@noname52rus
@noname52rus Жыл бұрын
спасибо!
@PavelMartynov-j9p
@PavelMartynov-j9p Жыл бұрын
В asyncio таски ведь не уходят ни в другой поток, ни в другой процесс, они в едином цикле событий, который в одном потоке 00:53
@TitanicTiming13
@TitanicTiming13 9 ай бұрын
Спасибо за видосы, одна маленькая просьбочка! Перед выгрузкой видео ускоряй его слегка, потому что лично мне ютубовского 2х мало для просмотра твоего контента))
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 9 ай бұрын
Это чтобы оставалось время подумать! )
@jamjam3337
@jamjam3337 9 ай бұрын
спасибо!😎
@unaibekovbakhyt6517
@unaibekovbakhyt6517 Жыл бұрын
Благодарю
@jackieuchiha7838
@jackieuchiha7838 Жыл бұрын
Лучший канал по Django! Будут ли видосы про автоматизацию деплоя Django проекта через github actions + zero downtime deployment?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Может будут , да тема вцелом не сложная ..
@gonfrix9382
@gonfrix9382 10 ай бұрын
а чем больше воркеров тем выше нагрузка на систему правильно? а если сам проект тяжелый? это же сильно по ресурсам бьет, есть ли альтернативные варианты выполнения тасков на такой случай?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 9 ай бұрын
Ну чем больше воркеров, тем больше запросов в базу, тем больше нагрузка на базу. Никак по-другому они систему не нагружают. Чтобы решить проблему нагрузки на базу лучше саму базу оптимизировать, добавить кеш, сделать еще read only базы и тд. Уменьшая количество Волкеров мы просто уменьшим производительность системы вцелом
@the_codest
@the_codest Жыл бұрын
Еще раз спасибо! Офигенный разбор! 👍👍👍 Правда, у меня косяк не воспроизводится, 😄 видимо, потому что я пошел путем апдейтов, а не сейвов: def set_price_from_service(service_instance_id): from .models import Subscription, Service time.sleep(10) service_instance = Service.objects.get(id=service_instance_id) queryset = service_instance.subscriptions.select_related('plan').only('plan__discount_percent', 'service_id') subscriptions = [] for i_subscription in queryset: new_price = service_instance.price - service_instance.price * i_subscription.plan.discount_percent / 100 i_subscription.price = new_price subscriptions.append(i_subscription) Subscription.objects.bulk_update(subscriptions, fields=['price']) @shared_task() def set_comment(service_instance_id): from .models import Subscription, Service service_instance = Service.objects.get(id=service_instance_id) queryset = service_instance.subscriptions.all() subscriptions = [] for i_subscription in queryset: i_subscription.comment = str(datetime.datetime.now()) subscriptions.append(i_subscription) time.sleep(20) Subscription.objects.bulk_update(subscriptions, fields=['comment'])
@Keto-menu
@Keto-menu Жыл бұрын
По поводу вашего вопроса. Как сделать так чтобы none не создавалось. Я в docker-compose после build вниз добавил image питона такой же как в Dockerfile. Вроде после этого перестает создаваться
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
А зачем мы используем transaction.atomic? Ведь select_for_update уже блокирует объекты модели для использования другим воркером. Если сделать то же самое без transaction.atomic, что изменится?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Select for update не работает вне transaction
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
@@SeniorPomidorDeveloper спасибо большое что отвечаете всем нам
@1978rembo
@1978rembo Жыл бұрын
Уроки по FastApi есть в планах ?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Пока нет. Может в следующем курсе
@dotco22
@dotco22 Жыл бұрын
Столкнулся с проблемой, что из двух задач всегда выполнялась только одна. Никак кроме удаления Singleton решить не смог
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
А разве singletone не для этого?
@ioannchimrov
@ioannchimrov Жыл бұрын
попробуй запускать команды в нужном контейнере через следующую команду: "docker-compose exec containe_name some_command_in_container" и в этом случае не будет создаваться новый контейнер
@СтепанГилёв-х7я
@СтепанГилёв-х7я Жыл бұрын
Можно зайти в контейнер и там уже писать команды,так image не будут создаваться ,а результат будет тот же, хотел тебе ещё задать вопрос - а почему не пользуешься тайпхинтами?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Да, согласен, через docker exec вроде так же работает. Тайпхинты - мы много спорили с коллегами по этому вопросу. Мое мнения что питон хорош тем, что это минималистичный, легко-читаемый язык. Если его превращать в Java по синтаксису, он никак не получит сильные стороны от Java, скорее получит его недостатки. в 99% случаев тайпхинты не нужны, когда и так очевидно что это за тип по названию. Но это зависит от проекта, конечно. Где-то они будут в тему. А вообще это спорный вопрос, кто-то прям за них всегда топит.
@ibrahimoglu
@ibrahimoglu Жыл бұрын
👍
@andreykuskov8807
@andreykuskov8807 Жыл бұрын
Я не до конца понял необходимости добавления в запрос select_for_update? Зачем? Судя по доке, лочит строки в таблице, но мы вроде также используем менеджер transaction.atomic, который гарантирует, что операция будет выполнена полностью или не выполнена вовсе.... Можно пояснить подробнее про эту связку?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Это разные вещи. Atomic делает операцию атомарной, а select for update чтобы параллельные таски не пытались изменить объект , по тому что их изменения могут быть перезаписаны . На видео я опытным путем подтверждаю эту необходимость , если досмотреть до конца .
@NRodriges
@NRodriges Жыл бұрын
Доброго времени суток! Благодарю за прекрасные курсы! Возник вопрос - если в Celery длительность очереди может быть большая, к примеру, час, то с этим возникают некоторые проблемы: - Если сервер перезагрузится по какой либо причине, таски исчезнуть, а значит и вся информация, которая должна была обновится, не будет обновляться. - Если я выключу сервер для обновления версии софта, то будет та же проблема - все таски слетят. Я чего-то не так понял и этих проблем не существует или для них уже есть решения?
@BorisenkoV89
@BorisenkoV89 Жыл бұрын
если я правильно понимаю, таски хранятся в Redis(БД) и селереи после перезапуска чекает редис.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Да, я думаю что проблемы будут скорее с тасками, которые уже запущены и в процессе выполнения на момент перезагрузки . Вроде была какая-то опция чтобы celery их перезапускал после перезагрузки, надо посмотреть в доке
@NRodriges
@NRodriges Жыл бұрын
@@BorisenkoV89Разве редис не очищается после перезагрузки системы?
@hhhscvx
@hhhscvx 5 ай бұрын
Сколько стоит воркеров делать в своих проектах?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 5 ай бұрын
Один. И дальше смотреть по нагрузке. Если очередь забивается и другие задачи долго ждут - значит другой, третий и тд.
@rostislavk3230
@rostislavk3230 11 ай бұрын
а где можно исходные коды посмотреть?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 11 ай бұрын
Тут github.com/chepe4pi/service_app
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
Почему когда вы добавили транзакции и воркеры разобрали таски, один таск закончился намного раньше и не ждал 20+27 секунд? Куда делись эти самые sleep?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
А в каком моменте видео это было?
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
​@@SeniorPomidorDeveloperна 25:05. И потом ещё вы говорите: "видно, что одна таска отработала значительно быстрее"
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Скорее всего на монтаже видео так неудачно подрезал. Там вроде дольше должен быть sleep , да
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
@@SeniorPomidorDeveloper понятно. Спасибо большое. Отлично объясняете.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
@user-kn5ip9lr6r спасибо что смотрите!
@vadimnikadon7332
@vadimnikadon7332 Жыл бұрын
Привет. Можно ли решить проблему параллелизма изменив уровень изоляции транзакций в самой бд? Например поставить repeatable read?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Привет. Ну в видео я показал два варианта: без трансакции и с ней. И то, как трансакция решает показанную проблему. Уровни изоляции они присутствуют в трансакциях. Без них не существуют. Тут же проблема что мы создали объект кода python , и он устарел , пока мы что-то делали , а потом мы его сохранили и он перезатер. Вообщем это немного другая ситуация.
Оптимизация Django. 8 - Redis и ручной кеш
24:48
Senior Pomidor Developer
Рет қаралды 10 М.
Оптимизация Django. 5 - Celery + Docker
30:31
Senior Pomidor Developer
Рет қаралды 16 М.
Оптимизация Django. 9 - DB Индексы
19:11
Senior Pomidor Developer
Рет қаралды 6 М.
Хочу стать Junior Python
16:29
Y_LAB University
Рет қаралды 9 М.
РЕФАКТОРИНГ: Избавляемся от дублирования
28:24
Senior Pomidor Developer
Рет қаралды 5 М.
Celery Django примеры #2 | Django School
53:24
Михаил Омельченко | Django School
Рет қаралды 45 М.
50 оттенков celery / Олег Чуркин (TechOps)
49:02
Python Channel
Рет қаралды 25 М.