如何将在task.py之外定义的函数转换为Celery任务,并使Celery worker在Django中对其进行处理

时间:2019-03-01 07:59:45

标签: django celery django-celery

我想在我的Django项目中使用Celery说“ MySite ”。我的目录结构如下

mysite
  - applications
    - api
      -tasks.py
      -urls.py
      -apps.py
      -__init__.py
      -v0
        -__init__.py
        -urls.py
        -views.py
        -utils.py 
      -v1
        -__init__.py
        -urls.py
        -views.py
        -utils.py
    - backbone
      -tasks.py
      -urls.py
      -apps.py
      -views.py
      -models.py
      -__init__.py
  -mysite
    - settings.py

我有两个应用程序 api backbone 。我在 api 目录中创建了 tasks.py ,该目录定义了各种Celery任务。我在 v0 v1 目录的 utils.py 中定义了各种功能。上述结构仅是实际项目的代表。该项目更大,更复杂。

我很高兴在 v0 / utils.py

中说 func1
def func1:
    #code

如何将 utils.py 中的 func1 转换为Celery任务,而不移动 func1 的位置或将其导入到 task.py 吗?我只想修改 func1 ,使其表现像芹菜任务,我应该能够应用重试选项等

1 个答案:

答案 0 :(得分:3)

tasks.py模块(my_celery_task_function())中创建一个新任务,然后在其中调用utils函数(util_function_1()util_function_2()

尝试这样的事情

#v0/utils.py
def util_function_1():
    # your code
    pass

# v1/utils.py
def util_function_2():
    # your code
    pass


#api/tasks.py
@app.task
def my_celery_task_function():
    from v1.utils import util_function_1
    from v2.utils import util_function_2
    util_function_1()
    util_function_2()

UPDATE-1
这是例子。您可以将 任何有效参数 添加到 @app.tasks() 装饰器。

# v0/utils.py
def func1():
    # your code
    pass


# api/tasks.py
@app.task(bind=True, default_retry_delay=30 * 60)
def my_celery_task_function_1(self, *args, **kwargs):
    from v1.utils import func1
    func1()