Django和Celery任务

aor9mmx1  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(141)

所以在我们的Django项目中,我们使用Celery和Django-Celery模块。最初编写任务部分的人是这样写的:

from djcelery import celery

@celery.task
def do_something():
    ...

但是在文档中的任何地方,它都表明我们应该创建一个单独的celery.py文件,并像这样导入应用程序:
celery.py

from celery import Celery

app = Celery('project')
if __name__=='__main__':
    app.run()

tasks.py

from celery import app # Importing `app` from our celery.py

@app.task
def do_something():
    ...

所以我想知道这样做是否有问题?我们使用的是Django-Celery版本3.1

js81xvg6

js81xvg61#

首页start with celery documentation
Celery之前的版本需要一个单独的库才能与Django一起工作,但从3.1开始就不再是这样了。Django现在是开箱即用的,所以这个文档只包含了一个基本的方法来集成Celery和Django。您将使用与非Django用户相同的API,因此建议您先阅读Celery教程的第一步,然后再回到本教程。当你有一个工作的例子,你可以继续下一步指南。
同样,Django-celery的自述文件的第一行声明如下
老 Django celery 集成项目。
总结一下,django-celery是你的应用程序使用的老方法,新文档遵循处理celery的新方法

omtl5h9j

omtl5h9j2#

你提到的两种方法都是在Django项目中使用Celery定义任务的有效方法。区别在于如何构造代码和配置Celery。
在你提到的第一种方法中,任务是直接在Django项目的代码库中使用来自djcelery@celery.task装饰器定义的。这种方法效果很好,适用于较小的项目或您喜欢将任务定义与Django代码的其余部分保持在同一模块中的项目。
在第二种方法中,您创建一个单独的celery.py文件,这是一个推荐的做法,适用于大型项目或希望将任务定义与主Django代码解耦的项目。通过使用单独的文件,您可以独立于Django项目的其余部分来配置Celery及其设置。这种方法提供了更大的灵活性,特别是如果您具有复杂的Celery配置或希望分离关注点。
第二种方法允许您使用celery模块中的Celery类配置Celery应用程序,而第一种方法使用djcelery提供的celery对象。与djcelery中的celery对象相比,celery模块中的Celery类提供了更多的配置选项和灵活性。
如果您使用的是Django-Celery 3.1版本,那么它可能是一个较旧的版本,与最新版本相比,它可能具有不同的约定或建议。但是,您提到的这两种方法在3.1版本中仍然可以工作。
一般来说,如果你正在启动一个新项目,或者你可以灵活地进行更改,我建议你遵循第二种方法,使用一个单独的celery.py文件(应该在包含www.example.com的同一个文件夹中创建settings.py)。它提供了一个更清晰的关注点分离,并允许更广泛的Celery配置选项。在www.example.com中celery.py,

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')
# In the above instead of proj use your project name

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()

@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

在init.py的同一个文件夹中,复制粘贴下面的代码,

from .celery import app as celery_app

__all__ = ('celery_app',)

在www.example.com中settings.py,

# Celery Configuration
CELERY_BROKER_URL = 'redis://localhost:6379'  # URL of your message broker (e.g., Redis) Replace with your Redis connection details
CELERY_RESULT_BACKEND = 'django-db'  # Result backend using Django database
CELERY_CACHE_BACKEND = 'django-cache'  # Cache backend using Django cache

# Celery Results Configuration (Optional)
CELERY_RESULT_EXPIRES = 3600  # Result expiration time (in seconds)

在www.example.com中settings.py,

INSTALLED_APPS = [
...
...
    'django_celery_results',
    'django_celery_beat',

    ....
]

在命令提示符下写下面的代码来运行celery,

celery -A project_name worker --loglevel=info

参考https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html

相关问题