Celery定期任务不访问模块变量

时间:2018-09-15 15:52:29

标签: python django celery

我的芹菜配置好并与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 :(得分:1)

不同的celery任务会产生不同的进程,这些进程不会共享对内存的访问。也就是说,您的全球业务在这些流程之间并不持久。当您的第一个任务完成时,与其进程关联的所有内存都将被刷新。第二项任务是在内存中创建一组全新的对象,包括全局变量。

您确实需要将数据保存在更持久的数据库或内存缓存中(例如,Memcache)。