我有一些非常冗长的任务函数,我想从我的tasks.py
模块中突破,但仍然可以像from myapp.tasks import my_task
那样调用。我尝试为每个任务创建子模块,但是我必须在tasks/__init__.py
中添加一些技巧,这似乎非常hackish(并且要求给出与模块名称相同的任务):
import pkgutil
for module_loader, name, ispkg in pkgutil.iter_modules(__path__):
__import__('myapp.tasks.%s' % name)
locals().update({name: getattr(locals()[name], name)})
答案 0 :(得分:5)
这个答案是关于管理命令而不是Celery后台任务意义上的任务。
我认为最直接的解决方案是首先将任务写为Django管理命令,然后从tasks.py中调用它们。这样,您可以将每个文件中的任务分解为一个任务,并且还具有能够从命令行任意调用任务的额外好处。
所以,在tasks.py
:
from django.core import management
@task()
def my_task():
management.call_command('my_task')
答案 1 :(得分:2)
我不熟悉Django-Celery但对Celery非常熟悉,所以这更像是一个可以回答你问题的一般性说明...
Celery任务在执行时按名称标识。默认情况下,任务被赋予其Python位置的名称,即。 '%s.%s' % (my_task.__module__, my_task.__name__)
或'myapp.tasks.function_name'。也就是说,您可以通过向@task装饰器提供'name'kwarg来覆盖任务名称。因此,如果您想覆盖任务名称:
# We're in myapp.tasks but the task will not be named myapp.tasks.my_task as expected
@task(name='some.overridden.name')
def my_task():
print 'Something'
答案 2 :(得分:1)
以下也有效:
tasks
tasks
包tasks/__init__.py
示例:
django_app
| tasks
| __init__.py
| filesystem_tasks.py
| admin.py
| url.py
tasks/filesystem_tasks.py
可以包含:
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
return x + y
tasks/__init__.py
可以包含:
from .filesystem_tasks import *
运行芹菜表示任务,因为它们将在一个tasks.py
中以与例如相同的级别声明。 url.py
。