![](/img/trans.png)
[英]How to inherit a django class method from views.py into tasks.py to schedule jobs with Celery?
[英]how can i split up a large django-celery tasks.py module into smaller chunks?
我有一些非常冗長的任務函數,我想從我的tasks.py
模塊中分離出來,但仍然能夠像from myapp.tasks import my_task
一樣調用。 我嘗試為每個任務創建子模塊,但后來我必須在tasks/__init__.py
一些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)})
這個答案是關於管理命令而不是Celery后台任務意義上的任務。
我認為最直接的解決方案是首先將任務編寫為Django管理命令,然后從tasks.py中調用它們。 這樣,您可以將每個文件的任務分解為一個任務,並具有能夠從命令行任意調用任務的額外好處。
所以,在tasks.py
:
from django.core import management
@task()
def my_task():
management.call_command('my_task')
我不熟悉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'
以下工作原理:
tasks
tasks
包中的python模塊中傳播你的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.