簡體   English   中英

我怎么能將一個大的django-celery tasks.py模塊拆分成更小的塊?

[英]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 ,這看起來非常h​​ackish(並且需要賦予任務與模塊相同的名稱):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM