Периодическая задача Celery, не обращающаяся к переменным модуля - PullRequest
0 голосов
/ 15 сентября 2018

У меня хорошо настроен сельдерей и я работаю с django.По сигналу post_save я отправляю новую запись в набор с помощью задачи и, используя другую периодическую задачу, пытаюсь использовать этот набор.

from __future__ import absolute_import, unicode_literals
from celery import shared_task

class Data():
    def __init__(self):
        self.slotshandler = set()

global data
data = Data()

@shared_task
def ProcessMailSending(): #This is a periodic task, running every 30 seconds
    global data #This variable is always empty here
    while slotshandler:
        slot_instance = slotshandler.pop()
        print("sending mail for slot } to {} by mail {}".format(slot_instance .id,slot_instance .user,slot_instance .user_mail))

@shared_task
def UpdateSlotHandler(new_slot): #This is called by save_post django signal
    global data
    data.slotshandler.add(new_slot) #filling the set at each new record

Проблема в том, что эта задача не видит мою новуюдобавлены временные интервалы.обратите внимание, что это приложение django работает на микро-сервисе для отправки пользователям напоминаний.

1 Ответ

0 голосов
/ 15 сентября 2018

Различные задачи сельдерея порождают разные процессы, которые не разделяют доступ к памяти.т.е. ваш глобальный не является постоянным между этими процессами.Когда ваша первая задача заканчивается, вся память, связанная с ее процессами, очищается.Ваша вторая задача создает в памяти новый набор объектов, включая вашу глобальную переменную.

Вам действительно нужно сохранять данные в более постоянном месте, например, в БД или в кэш-памяти (например, Memcache).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...