которая отправляет сообщения юзерам.
Сейчас он у меня запускается каждые 10 секунд чтобы проверить очередь и обработать запросы если в очереди что то есть.
Теперь проблема.
У меня получается так что, за 10 секунд селери не успевает обратотать все запросы, и запускает новый таск sendMail
И берет те запросы из очереди которые уже обрабаотываются предыдущим запустившимся процессом.
Получается что 1 запрос обрабаотывается 2-3 раза...
Как можно сделать, чтобы селери таска блокалась, пока предыдущая запущенная не отработает полностбю?
хранить где-нибудь лок? смотреть, если он есть, просто выходить, следующая таска попробует еще раз, если уж они так часто запускаются я бы еще обернул в try/except и в finally снимал этот лок. ну и на всякий случай добавлял к нему timestamp, чтобы он гарантированно протухал через какое-то время (это перестраховка, конечно, но мало ли как упадет процесс, может возникнуть ситуация, что лок не отпустится)
прочитай про примитивы синхронизации
https://docs.python.org/3/library/asyncio-sync.html
Может запускать не через время, а чтобы по завершении таск сам себя запускал с отложкой на 10 сек? Я так делал
Можно попробовать с вот этим попердолиться https://docs.celeryproject.org/en/stable/userguide/tasks.html#Task.rate_limit
Но вообще выглядит так, будто celery тебе здесь вообще не нужен: простенький сервис, который сообщения берет из очереди должен с этим справиться.
При чем тут асинк? И зачем лочить? Ведь самый простой способ синхронизации это чтобы все работало в одном процессе/потоке. The best way to synchronize data is to put them in a one thread. Т.е. у него просто один скрипт который сам себя запускает. Как я это вижу.
там кроме отправки сообщений, много других тасков живут, надо все асинхронно выполнять А селери для этого отлично подходит думаю
Он советует тебе микросервис создать. Фактически аналог моего совета поместить все в один воркер, что тоже хорошая идея.
есть у тебя асинхронные таски в очередь становятся, то тебя поток не спасет
ну про другие таски ничего не могу сказать, кроме того, что если у тебя масшатиборования нет, то от celery не то, чтобы много толку, конкретно эту задачу проще тебе будет засунуть в отдельный сервис и пускай крутится.
воркер один на конкретный вид таски спасет. А если несколько воркеров достают из очереди которая пополняется каждые 10 секунд, то ты сам должен понимать что будет
ну "микросервис" испохабленное слово, но смысл такой, да.
Ты вообще читал что я написал? Ты создаешь таск который делает что-то (разгребает задачи) и по окончании ставит себя в очередь на выполнение. Всё. Не будет никакой гонки.
легче уже тогда его в While True засунуть
Обсуждают сегодня