web-dev-qa-db-ja.com

一部のCeleryタスクは機能し、その他はNotRegisteredです

私は Celery Django チュートリアルに従い、例(_add, mul_)に表示されるタスクは完全に機能します。 res = add.delay(1,2); res.get()を実行すると、正しい応答が得られます。

しかし、別のタスクres = sayhello.delay('trex')を実行しようとすると、_*** NotRegistered: u'pipeline.tasks.sayhello'_が返されます。

res = sayhello('trex')を実行すると、resと入力するだけで結果を取得できます。しかし、このように、私はセロリを使用せずに、関数を雑用的に実行します。

タスクは機能します実行した場合のみDjangoシェル _./manage Shell_

_>>> res = sayhello.delay('trex')
>>> res.get()
u'Hello trex'
_

したがって、問題は、_pipeline/views.py_からsayhelloタスクを実行できないことです。しかし、そこからタスクaddmulを実行できます。

何故ですか? _views.py_からタスクを正しく実行する方法は?

エラーフルメッセージ:

_[2016-11-11 10:56:09,870: ERROR/MainProcess] Received unregistered task of type u'pipeline.tasks.sayhello'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you're using relative imports?

Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.

The full contents of the message body was:
'[["tiger"], {}, {"chord": null, "callbacks": null, "errbacks": null, "chain": null}]' (84b)
Traceback (most recent call last):
  File "/home/trex/Development/Sirius/new/rocket/rocket-venv/local/lib/python2.7/site-packages/celery/worker/consumer/consumer.py", line 549, in on_task_received
    strategy = strategies[type_]
KeyError: u'pipeline.tasks.sayhello'
_

Djangoバージョン

_1.9.7
_

セロリバージョン:

_celery==4.0.0
Django-celery==3.1.17
_

Djangoプロジェクトのディレクトリツリー:

_rocket
├── etl
│   ├── etl
│   │   ├── celery.py
│   │   ├── __init__.py
│   │   ├── settings
│   │   │   ├── base.py
│   │   │   ├── dev.py
│   │   │   ├── __init__.py
│   │   │   ├── production.py
│   │   │   └── test.py
│   │   ├── urls.py
│   │   ├── wsgi.py
│   ├── manage.py
│   ├── pipeline
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── tasks.py
│   │   ├── tests.py
│   │   ├── urls.py
│   │   ├── views.py
_

etl/pipeline/views.py

_from .tasks import *

def get_response(request):
    result = add.delay(1, 2)
    result.get()
    result = sayhello.delay('tiger')
    result.get()
_

etl/pipeline/tasks.py

_from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def add(x, y):
    return x + y

@shared_task
def mul(x, y):
    return x * y

@shared_task
def sayhello(name):
    return "Hello %s" % name
_

また、私はこれを試しました:

_from celery.decorators import task

@task(name="sayhello")
def sayhello(name):
    return "Hello {0}".format(name)
_

etl/celery.py

_from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('Django_SETTINGS_MODULE', 'etl.settings.base')
app = Celery('etl')
app.config_from_object('Django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
_

etl/__ init__py

_from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
_

etl/settings/base.py

_...
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/London'
CELERY_IMPORTS = ('pipeline.tasks', )
_
10
srgbnd

エラーは、CELERY_IMPORTS設定がetl/settings /base.pyファイルで正しく機能していないためです。だから私の提案は:

からカンマを削除します

CELERY_IMPORTS = ('pipeline.tasks' , )

それでも問題が解決しない場合は、次のコマンドを実行します。

celery -A pipeline.tasks worker --loglevel=DEBUG

もう1つ、tasks.pyファイルをインポートするにはDjangoアプリ(settings.pyに登録されている)にある必要があります。この点も確認してください。ありがとうございます。

5
Prakhar Trivedi

これはうまくいけば誰かを助けるかもしれません。コードを変更し、セロリワーカーの再起動を怠りました。

Try restarting the celery workers

2
Karuhanga

最近この問題が発生しました。インポートエラーにより、タスクが正しく登録されませんでした。サイレントに失敗していたので、インポートエラーが原因でタスク登録が失敗したことを知ることができませんでした。うまくいけば、これはセロリに登録されていないタスクで立ち往生している誰かを助けることができます。

1
briancaffey

相対インポートと自動名前生成はうまく連携しないため、相対インポートを使用している場合は、名前を明示的に設定する必要があります。

たとえば、クライアントがモジュール「myapp.tasks」を「.tasks」としてインポートし、ワーカーがモジュールを「myapp.tasks」としてインポートした場合、生成された名前は一致せず、NotRegisteredエラーが発生します。労働者によって育てられた。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-naming-relative-imports

1
Toanalien