3

モジュールから分割したい非常に長いタスク関数がいくつかありtasks.pyますが、それでも のように呼び出すことができますfrom myapp.tasks import my_task。各タスクのサブモジュールを作成しようとしましたが、かなりハックのように見えるいくつかのトリックを に挿入するtasks/__init__.py必要があります (タスクにモジュールと同じ名前を付ける必要があります)。

import pkgutil

for module_loader, name, ispkg in pkgutil.iter_modules(__path__):
    __import__('myapp.tasks.%s' % name)
    locals().update({name: getattr(locals()[name], name)})
4

3 に答える 3

4

この回答は、Celery バックグラウンド タスクという意味でのタスクではなく、管理コマンドに関するものです。


最も簡単な解決策は、最初にタスクを Django 管理コマンドとして記述し、次にそれらを tasks.py から呼び出すことだと思います。このようにして、タスクをファイルごとに 1 つのタスクに分割でき、コマンド ラインからタスクを任意に呼び出すことができるという追加の利点があります。

だから、でtasks.py

from django.core import management

@task()
def my_task():
    management.call_command('my_task')
于 2013-01-31T18:14:10.987 に答える
2

私はDjango-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'
于 2013-01-31T00:02:13.993 に答える