セロリが未登録のタイプのタスクを受信しました(例を実行)


96

セロリのドキュメントからを実行しようとしています。

走る: celeryd --loglevel=INFO

/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
  "is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]  

 -------------- celery@ubuntu v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      celery.loaders.default.Loader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery

tasks.py:

# -*- coding: utf-8 -*-
from celery.task import task

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

run_task.py:

# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())

同じフォルダceleryconfig.py内:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

「run_task.py」を実行すると:

Pythonコンソール

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

Celerydサーバーのエラー

[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
    self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'

何が問題か説明してください。


12
こんにちは、問題の内容と解決方法を教えてください。受け入れられた答えは、他の人がこの問題をどのように解決できるかを明確にしません。ありがとう。
ジョーダンライター2012

3
私はジョーダンと一緒です-これはまったく役に立ちませんでした。反対投票。
ジェイテイラー

2
aihoの答えが正しいものである:CELERY_IMPORTS = ("tasks", )
アルプ

回答:


49

celery.registry.TaskRegistryクラスに登録されているタスクの現在のリストを確認できます。(現在のディレクトリにある)celeryconfigが存在しないPYTHONPATHため、celeryがそれを見つけられず、デフォルトにフォールバックする可能性があります。セロリを開始するときに明示的に指定するだけです。

celeryd --loglevel=INFO --settings=celeryconfig

設定することもでき--loglevel=DEBUG、おそらくすぐに問題が発生するはずです。


4
+1 --loglevel=DEBUG、私のタスクに構文エラーがありました。
Jacob

12
celerydは廃止されました。今、celery workerたとえばDjangoこのように実行する必要がありますcelery --app=your_app.celery worker --loglevel=info
andilabs

私(セロリ3.1.23)ではcelery.registry.tasks、現在のすべてのタスクのリストを表示するために使用する必要がありました。を実行すると、いつでも確認できますdir(celery.registry)
Nick Brady

以下のため--loglevel=DEBUGにも私の側から
尚美学園大学

64

ワーカーサーバーを再起動する必要があると思います。同じ問題に遭遇し、再起動することで解決します。


8
ありがとう!私がこれを1時間前に見つけたことを願います
Nexus

2
これで解決しました。celerydスクリプトを使用している場合、ワーカーは起動時にタスクモジュールをインポートします。その後、さらにタスク関数を作成したり、既存のタスク関数を変更したりしても、ワーカーはそれらを読み取ったときと同じようにメモリ内コピーを使用します。
マーク

1
注:タスクが登録されているかどうかは、実行することで確認できますcelery inspect registered
Nick Brady

1
--autoreloadコードが変更されるたびにセロリを再起動するオプションを使用して、セロリを起動することもできます。
Sergey Lyapustin 16

残念ながら非推奨です。一つは、このリンクからソリューションを使用することができます。avilpage.com/2017/05/...
トマシュSzkudlarek

50

私は同じ問題を抱えていました:理由"Received unregistered task of type.."は、celerydサービスがサービスの開始時にタスクを見つけて登録しなかったためです(ところで、開始時にタスクのリストが表示されます ./manage.py celeryd --loglevel=info)。

これらのタスクはCELERY_IMPORTS = ("tasks", )設定ファイルで宣言する必要があります。
特別なcelery_settings.pyファイルがある場合は、--settings=celery_settings.pydigivampireが書いたように、celeryd サービスの開始時に宣言する必要があります。


1
おかげで、manage.pyコマンドの代わりに〜/ path / to / celery / celerydを使用してセロリを開始したため、実際に問題が発生しました!
アントワーヌ

27

CELERY_IMPORTSまたはを使用するかどうかに関係なくautodiscover_tasks、重要な点は、タスクを見つけられることと、Celeryに登録されているタスクの名前が、ワーカーが取得しようとする名前と一致していることです。

セロリを起動するcelery worker -A project --loglevel=DEBUGと、タスクの名前が表示されます。たとえば、にdebug_taskタスクがあるとしますcelery.py

[tasks]
. project.celery.debug_task
. celery.backend_cleanup
. celery.chain
. celery.chord
. celery.chord_unlock
. celery.chunks
. celery.group
. celery.map
. celery.starmap

リストにあなたの仕事を見ることができない場合は、のいずれかで、あなたのセロリ構成の輸入正しくタスクを確認してください--setting--configceleryconfigまたはconfig_from_object

セロリビートを使用している場合は、使用するタスク名が、セロリタスクリストの名前と一致することを確認してtaskくださいCELERYBEAT_SCHEDULE


これはとても役に立ちました。タスクの名前は、CELERYBEAT_SCHEDULEの「タスク」キーと一致する必要があります
ss_millionaire

*重要な点は、タスクが見つかり、Celeryに登録されているタスクの名前が、ワーカーが取得しようとする名前と一致していることです。* いい視点ね!!!
Light.G

これが正解です。BEAT_SCHEDULERのタスク名は、自動検出されたタスクのリストに表示されるものと一致する必要があります。したがって、使用した場合@task(name='check_periodically')、ビートスケジュールに入力したものと一致するはずですCELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
。IE

16

私も同じ問題を抱えていました。追加した

CELERY_IMPORTS=("mytasks")

celeryconfig.pyそれを解決するために私のファイルに。


6
これはリストやタプルでなければならないこと注:CELERY_IMPORTS = ['my_module']
asksol

これでうまく
いき

12
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

include = ['proj.tasks'] トップディレクトリに移動して、これを実行する必要があります

celery -A app.celery_module.celeryapp worker --loglevel=info

ない

celery -A celeryapp worker --loglevel=info

celeryconfig.pyの入力でimports =( "path.ptah.tasks"、)

他のモジュールでタスクを呼び出してください!!!!!!!!


1
includeあなたは相対的な輸入品を使用している場合に追加されるのparam必要。私はそれを追加することで問題を解決しました
CK.Nguyen

1
この文字列に対する回答に投票しましたplease in other module invoke task!!!!!!!!。それは役に立ちました。
VolArt 2019年

8

--settingsを使用してもうまくいきませんでした。すべてを機能させるには、以下を使用する必要がありました。

celery --config=celeryconfig --loglevel=INFO

これは、CELERY_IMPORTSが追加されたceleryconfigファイルです。

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

CELERY_IMPORTS = ("tasks",)

私はスーパーバイザを使用してセロリをデーモンとして起動しているため、セットアップは少しトリッキーでした。


8

私にとって、このエラーは、タスクを含むアプリがdjangoのINSTALLED_APPS設定に含まれるようにすることで解決されました。


また、タスクは<app> /tasks.pyからアクセスできる必要がありました
np8

3

私のdjangoアプリに信号処理を追加したところ、不思議なことにこの問題が発生しました。そうすることで、AppConfigを使用するようにアプリを変換しました。つまり、単に'bookingin として読み取る代わりにINSTALLED_APPS、を読み取ります'booking.app.BookingConfig'

私は、追加のでセロリは、どのような手段であることを理解していないINSTALLED_APPS_WITH_APPCONFIGS = ('booking',)私のDjangoの設定に、そして私を修正celery.pyから

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)

3

私にとってうまくいったのは、セロリタスクデコレータに明示的な名前を追加することでした。タスク宣言をからに変更し@app.tasksました@app.tasks(name='module.submodule.task')

ここに例があります

# test_task.py
@celery.task
def test_task():
    print("Celery Task  !!!!")

# test_task.py
@celery.task(name='tasks.test.test_task')
def test_task():
    print("Celery Task  !!!!")

2

Celery Beatからのタスクの実行でも同じ問題が発生しました。Celeryは相対インポートが好きではないので、私のceleryconfig.pyでは、完全なパッケージ名を明示的に設定する必要がありました。

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

セロリのドキュメントに完全なパッケージ名の例がもっとあればいいのですが。この回答でfull.path.to.addを確認したところ、インポートが不要であることがわかりました。ソリューションがシンプルで、app.conf.beat_scheduleのより良い例が必要であることを知っていました。
zerocog 2017

2

これは、奇妙なことに、パッケージが欠落していることが原因である可能性もあります。pipを実行して、必要なすべてのパッケージをインストールします。 pip install -r requirements.txt

autodiscover_tasks 不足しているパッケージを使用するタスクを取得していませんでした。


1
同様の問題がありました。インポート中に例外が発生すると、自動検出の一部が完了しなくなると思います。
Tim Tisdall、

ああ、そうですね。ありがとう
kakoma 2018

1

Djangoには何の問題もありませんでした。しかし、私がFlaskを使用していたときにこれに遭遇しました。解決策は設定オプションを設定することでした。

celery worker -A app.celery --loglevel=DEBUG --config=settings

Djangoを使用しているときは、次のようになりました。

python manage.py celery worker -c 2 --loglevel=info


1

私もこの問題に遭遇しましたが、まったく同じではないので、参考までに。最近のアップグレードでは、このデコレータ構文が原因でこのエラーメッセージが表示されます。

ERROR/MainProcess] Received unregistered task of type 'my_server_check'.

@task('my_server_check')

ちょうどに変更しなければならなかった

@task()

理由がわかりません。


1

次のようなインストール済みアプリでアプリ構成を使用している場合:

LOCAL_APPS = [
'apps.myapp.apps.MyAppConfig']

次に、設定アプリで、次のようなreadyメソッドでタスクをインポートします。

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'apps.myapp'

    def ready(self):
        try:
            import apps.myapp.signals  # noqa F401
            import apps.myapp.tasks
        except ImportError:
            pass

0

この種のエラーが発生している場合、いくつかの原因が考えられますが、解決策は、/ etc / defaults / celeryd内の私のceleryd構成ファイルが特定のdjangoプロジェクトではなく、標準で使用するように構成されていることです。セロリのドキュメントで指定されている形式に変換するとすぐに、すべてがうまくいきました。


0

この行を/ etc / default / celerydに追加するための解決策

CELERYD_OPTS="-A tasks"

これらのコマンドを実行すると、

celery worker --loglevel=INFO
celery worker -A tasks --loglevel=INFO

後者のコマンドだけがタスク名を表示していました。

CELERY_APP行/ etc / default / celerydも追加してみましたが、どちらも機能しませんでした。

CELERY_APP="tasks"

0

django-celeryのPeriodicTaskクラスに問題がありましたが、実行がトリガーされるたびにセロリワーカーを開始すると、それらの名前が正常に表示されました。

KeyError:u'my_app.tasks.run '

私のタスクは、「ru​​n」というメソッドだけでなく、「CleanUp」という名前のクラスでした。

テーブル「djcelery_periodictask」を確認したところ、古いエントリが表示され、それらを削除すると問題が解決しました。


0

このエラーで私のケースに私の2セントを追加するだけです...

私のパスがある/vagrant/devops/testapp.pyし、__init__.pyそれに。

実行するcd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infoと、このエラーが発生します。

しかし、私がそれをcd /vagrant/devops/test && celery worker -A app.celery --loglevel=infoすべてのように実行すると、大丈夫です。


0

プログラマーの1人がインポートの1つに次の行を追加したことがわかりました。

os.chdir(<path_to_a_local_folder>)

これにより、Celeryワーカーは作業ディレクトリをプロジェクトのデフォルトの作業ディレクトリ(タスクを見つけることができる場所)から別のディレクトリ(タスクを見つけることができない場所)に変更しました。

このコード行を削除すると、すべてのタスクが見つかり、登録されました。


0

Celeryは相対インポートをサポートしていないため、私のceleryconfig.pyでは絶対インポートが必要です。

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}

0

本当に便利なリストへの追加アイテム。

タスクのエラーに関してCeleryが容認できないことを発見しました(または少なくとも適切なログエントリを追跡できませんでした)。それらは登録されません。Celeryをサービスとして実行する際に多くの問題がありましたが、それらは主に権限に関連しています。

ログファイルへの書き込み権限に関連する最新のもの。コマンドラインでのセロリの開発または実行に問題はありませんでしたが、サービスはタスクを未登録として報告しました。

サービスがログフォルダーに書き込めるようにするには、ログフォルダーのアクセス許可を変更する必要がありました。


0

私の2セント

これは、アルパインを使用したドッカー画像で取得していました。/dev/logsyslogにロギングするために参照されるdjango設定。djangoアプリとセロリワーカーはどちらも同じ画像に基づいています。djangoアプリイメージのエントリポイントは起動時syslogdに起動していましたが、セロリワーカーのエントリポイントは起動していませんでした。これは./manage.py shell何もないので失敗するようなものを引き起こしていました/dev/log。セロリ労働者は失敗していませんでした。代わりshared_taskに、djangoプロジェクトのアプリケーションからのエントリの読み込みを含む、アプリの起動の残りの部分を無視して静かにした


0

私の場合、エラーは、1つのコンテナーがdocker-composeを使用してホストファイルシステムにマウントされたフォルダーにファイルを作成したためでした。

ホストシステム上のコンテナーによって作成されたファイルを削除するだけで、プロジェクトを再び起動できました。

sudo rm -Rfフォルダー名

(ファイルはrootユーザーが所有していたため、sudoを使用する必要がありました)

Dockerバージョン:18.03.1


0

を使用する場合はautodiscover_tasksfunctions登録するがtasks.py他のファイルではなくにあることを確認してください。またはfunctions、登録したいセロリが見つからない。

使用app.register_taskも機能しますが、少し素朴なようです。

このの公式仕様を参照してくださいautodiscover_tasks

def autodiscover_tasks(self, packages=None, related_name='tasks', force=False):
    """Auto-discover task modules.

    Searches a list of packages for a "tasks.py" module (or use
    related_name argument).

    If the name is empty, this will be delegated to fix-ups (e.g., Django).

    For example if you have a directory layout like this:

    .. code-block:: text

        foo/__init__.py
           tasks.py
           models.py

        bar/__init__.py
            tasks.py
            models.py

        baz/__init__.py
            models.py

    Then calling ``app.autodiscover_tasks(['foo', bar', 'baz'])`` will
    result in the modules ``foo.tasks`` and ``bar.tasks`` being imported.

    Arguments:
        packages (List[str]): List of packages to search.
            This argument may also be a callable, in which case the
            value returned is used (for lazy evaluation).
        related_name (str): The name of the module to find.  Defaults
            to "tasks": meaning "look for 'module.tasks' for every
            module in ``packages``."
        force (bool): By default this call is lazy so that the actual
            auto-discovery won't happen until an application imports
            the default modules.  Forcing will cause the auto-discovery
            to happen immediately.
    """

0

ファイルタスクへの正しいパスを書き込む

app.conf.beat_schedule = {
'send-task': {
    'task': 'appdir.tasks.testapp',
    'schedule': crontab(minute='*/5'),  
},

}


0

「celery -A conf worker -l info」コマンドでセロリを実行すると、すべてのタスクがログにリストされていました。conf.celery.debug_taskこの正確なタスクパスを指定していないため、エラーが発生しました。正確なタスクIDをコピーして貼り付けて、これを再確認してください。


0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])

0

問題に対する答えは、質問で提供した出力の最初の行にあります/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, )))。適切な構成がないと、Celeryは何もできません。

celeryconfigが見つからない理由は、PYTHONPATHにない可能性があります。


0

私の問題は解決しました。私の「タスク」は「celery_task」という名前のpythonパッケージの下にありますcelery worker -A celery_task.task --loglevel=info。このパッケージを終了すると、コマンドが実行されます。できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.