Size: a a a

2020 December 17

💭П

💭 Руслан Прохоров... in rannts
просто что бы не писать в return
источник

RB

Roman Bolkhovitin in rannts
ildar nizamov
я бы заюзал для объявления не только типа, но и имени и дефолтного значения возвращаемой переменной в заголовке функции
имхо стилистически очень спорный вариант и потенциально может приводить к ошибкам. типа где-нибудь в логике накосячил, но вместо ошибки unresolved reference получаешь просто дефолтное значение в ретурне. если тестов нет, обязательно так случится )))
источник

A🌚

Al 🌚l in rannts
Нинада такого в питоне, а то начнутся ошибки переиспользования дефолтных объектов, как оно с аргументами сейчас ломается
источник
2020 December 18

БС

Байт Словович... in rannts
@cykooz ты научился правильно тестировать celery? А именно уйти от глобального celery_app
Ну то есть сейчас код такой:
celery = Celery(include=include)

@celery.task()
def empty_task():
   logbook.info("Empty task is running")
   return True


Получается celeryapp создается при импорте модуля, а соответственно и коннекшены к редису создаются. И в случае тестов получается два Celery объекта. Один который создаётся при импорте, а второй из фикстуры celery_app. Ну и самое противное, во время импорта модуля с тасками, у меня еще не мокан путь для редиса, который в unittestах используется. И получается что таски кладутся в очередь не unittestового редиса. А воркер в тестах слушает очередь в unittestовом redis'е.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Байт Словович
@cykooz ты научился правильно тестировать celery? А именно уйти от глобального celery_app
Ну то есть сейчас код такой:
celery = Celery(include=include)

@celery.task()
def empty_task():
   logbook.info("Empty task is running")
   return True


Получается celeryapp создается при импорте модуля, а соответственно и коннекшены к редису создаются. И в случае тестов получается два Celery объекта. Один который создаётся при импорте, а второй из фикстуры celery_app. Ну и самое противное, во время импорта модуля с тасками, у меня еще не мокан путь для редиса, который в unittestах используется. И получается что таски кладутся в очередь не unittestового редиса. А воркер в тестах слушает очередь в unittestовом redis'е.
Да, в целом можно сказать что научился. У нас нет глобального celery. Его экзепляр создаётся в момент инициализации веб-приложения и сохраняется в реестре приложения.
В тестах я не использую реальный брокер. Я использую in-memory брокер и запускаю выполнение тасков on-demand. Т.е. если мне в тестах не интересны сами таски и их результаты - я их не запускаю. Или запускаю только те которые мне надо.  Причём таски запускаются в этом же процессе и треде, и я могу в тестах ловить исключения в них. Если интересно, то можешь вот тут поглядеть:
https://github.com/Cykooz/pcelery/blob/master/src/pcelery/testing.py
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Единственное что ещё у нас не доведено до ума - это возможность переконфигурировать celery-приложение, когда оно уже проинициализировано. Например добавить в него новую очередь. Это бывает нужно в кастомизациях под кастомеров.
источник

БС

Байт Словович... in rannts
> Я использую in-memory брокер и запускаю выполнение тасков on-demand
это аналог старого eager ? Если так, то мне не подходит. В тестах хочется отловить race condition, хотябы самые тупые..

> Его экзепляр создаётся в момент инициализации веб-приложения и сохраняется в реестре приложения.
А как это выглядит? Я нашел вот такую статью, но нифига не понял :-( https://docs.celeryproject.org/en/stable/internals/app-overview.html
источник

KK

Kirill (Cykooz) Kuzm... in rannts
У нас даже таски регаются в celery_app не все по которым прошёлся питонячий импорт (это ведь вообще только один раз работает, и потому нужен глобальный celery_app). А только те, которые нужны для тестируемого приложения в проекте. Т.е. если я тестирую приложение только users, то у меня не будут запускаться таски из приложения files, т.к. users не зависит от него.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Байт Словович
> Я использую in-memory брокер и запускаю выполнение тасков on-demand
это аналог старого eager ? Если так, то мне не подходит. В тестах хочется отловить race condition, хотябы самые тупые..

> Его экзепляр создаётся в момент инициализации веб-приложения и сохраняется в реестре приложения.
А как это выглядит? Я нашел вот такую статью, но нифига не понял :-( https://docs.celeryproject.org/en/stable/internals/app-overview.html
Нет это не аналог - это брокер. eager просто запускал таску там где она ставилась в очередь (и в этом же окружении). При использовании брокера она запускается отдельно, по требованию, и окружение там не такое же как в той функции, которая поставила таску в очередь
источник

KK

Kirill (Cykooz) Kuzm... in rannts
race-condiotion можешь и без celery поотлавливать, запуская в тредах-процессах нужные тебе функции одновременно или в нужном порядке
источник

KK

Kirill (Cykooz) Kuzm... in rannts
> А как это выглядит?
Ну фактически, у нас celery-приложение иницализируется и создаётся либо при первой попытке использовать какую-то таску, либо при запросе из реестра экзепляра celery-приложения (использование таски вызывает эту же функцию)
источник

БС

Байт Словович... in rannts
а как таски декларируешь
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Байт Словович
а как таски декларируешь
Через свой совместимый декоратор работающий через venusian
https://github.com/Cykooz/pcelery/blob/master/src/pcelery/__init__.py#L47
источник

БС

Байт Словович... in rannts
пасиб, поизучаю
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Он просто запоминает что мол есть "таска". А добавляет её в celery только при завершении конфигурирования проекта
источник

KK

Kirill (Cykooz) Kuzm... in rannts
И если по таске не "прошёлся" scan() в момент конфигурирования проекта, то она не будет добавлена в celery
источник

KK

Kirill (Cykooz) Kuzm... in rannts
В общем у нас нет ни какой самодеятельности в import-time
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Все регистарции просиходят в конкретный момент времени и привязаны к конкретому экземпляру веб-приложения
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Если создать новое веб-приложение - в нём не будет ни целери, ни тасков, пока не завершится его конфигурация
источник

БС

Байт Словович... in rannts
это ваще супер. Отдельное спасибо за venusian. Давно мечтал о такой либе
источник