使用 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 失败的情况下设置重试任务