使用 django-celery 时如何创建单个类对象?

Posted

技术标签:

【中文标题】使用 django-celery 时如何创建单个类对象?【英文标题】:How to create single class object when using django-celery? 【发布时间】:2019-09-16 05:58:45 【问题描述】:

我正在使用 celery beat schedule 在午夜自动重置属性。之后,我还想使用 firebase 向所有相关用户发送通知。所以,我写了以下代码。

def send_notification(reg_ids, data_message):

    push_service = FCMNotification(api_key=fcm_config['GCM_API_KEY'])
    push_service.multiple_devices_data_message(registration_ids=reg_ids, data_message=message)


@shared_task 
def reset_daily_count():

    try:
        User.objects.all().update(daily_attempts=3)
    except Exception as e:
        logger.debug(e)
    else:
        send_notification(reg_ids, data_message)

但是这段代码会创建FCMNotification 对象,每次我都会调用它。我想要的是创建一个对象并在需要时从某个地方访问它,即使对于其他芹菜任务,不仅是定期任务,还有正常任务。我该怎么做?

【问题讨论】:

【参考方案1】:

只需在定义类的地方创建一个对象,然后像这样将其导入到任何你想要的地方。

class FCMNotification:
    pass
    # daclaration


push_service = FCMNotification(api_key=fcm_config['GCM_API_KEY'])

您可以在 celery 任务中使用push_service 以及像这样的普通代码。

from <PATH> import push_service

【讨论】:

每次调用import语句时它不会创建单独的push_service实例吗?基本上我的问题是这个 push_service 什么时候会被销毁? 另外,如果我在不同的文件中导入push_service,它会创建FCMNotification的不同对象还是相同? push_service 将引用同一个对象,无论它被导入多少次。它将在第一次导入某处时创建。我认为(不确定)它将为 django 和 celery 进程创建单独的对象。但是对于一个进程,它将引用同一个对象。并在进程停止时销毁。 是的,它将为每个进程创建单独的对象 我检查了一下,它正在为 django 服务器、celery worker 和 celery beat 创建 2 个对象(因为每个对象都有 2 个进程)。所以,是的,它为每个进程创建不同的对象,但为进程维护它。谢谢!!!

以上是关于使用 django-celery 时如何创建单个类对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django-Celery 失败的情况下设置重试任务

使用多个 v-on:click 时如何仅绑定单个类?

如何在heroku服务器中配置django-celery

我应该使用 django-celery 递归更新我的数据库吗?

创建单个对象时如何执行多个构造函数[重复]

如何判断任务是不是已经在 django-celery 中排队?