web-dev-qa-db-ja.com

セロリは、タイプの未登録タスクを受け取りました(例を実行)

Celeryドキュメントから example を実行しようとしています。

走る: 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」を実行すると:

on python console

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'

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

78
Echeg

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

celeryd --loglevel=INFO --settings=celeryconfig

--loglevel=DEBUGを設定することもでき、おそらくすぐに問題が表示されるはずです。

43
astevanovic

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

48
Wei An

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

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

47
aiho

CELERY_IMPORTSまたはautodiscover_tasksのどちらを使用する場合でも、重要なポイントはタスクが見つかり、Celeryに登録されているタスクの名前がワーカーが取得しようとする名前と一致する必要があることです。

Celeryを起動すると、celery worker -A project --loglevel=DEBUGと言うと、タスクの名前が表示されます。たとえば、debug_taskcelery.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のいずれかで、セロリの設定がタスクを正しくインポートしていることを確認してください。

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

21
Shih-Wen Su

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

CELERY_IMPORTS=("mytasks")

私のceleryconfig.pyファイルで解決します。

13

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

8
cars

--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",)

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

7
Jarie Bolander
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"、)

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

7
heyue

私のために働いたのは、セロリタスクデコレータに明示的な名前を追加することでした。タスク宣言を_@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
Lukasz Dynowski

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

autodiscover_tasksは、不足しているパッケージを使用するタスクをピックアップしていませんでした。

2
kakoma

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

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

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

_ERROR/MainProcess] Received unregistered task of type 'my_server_check'._

@task('my_server_check')

に変更する必要がありました

@task()

理由はわかりません。

1
stonefury

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

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

djangoの場合、次のようになりました。

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

1
Nihal Sharma

この種のエラーが発生している場合、考えられる原因はいくつかありますが、解決策は、/ etc/defaults/celerydのceleryd構成ファイルが特定のDjangoプロジェクト: celery docs で指定された形式に変換するとすぐに、すべてがうまくいきました。

0
tufelkinder

この行を/ 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
fatihpense

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

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

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

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

0
MurrayAusUK

問題に対する答えは、質問で提供した出力の最初の行/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
DejanLekic

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

0
HengHeng

ファイルタスクへの正しいパスを書く

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

}

0

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

os.chdir(<path_to_a_local_folder>)

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

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

0
Amit Zitzman

このエラーで私のケースに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
Kostas Demiris

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

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

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

Sudo rm -Rfフォルダー名

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

Dockerバージョン:18.03.1

0
jjacobi

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

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

私の2セント

Alpineを使用して、これをdockerイメージで取得していました。 Django設定参照/dev/log syslogへのロギング用。 Djangoアプリとセロリのワーカーは両方とも同じ画像に基づいていました。Djangoアプリ画像のエントリポイントは起動時にsyslogdしかし、セロリ労働者用ではありませんでした。これは、./manage.py Shellが存在しないため失敗する/dev/log。セロリ労働者は失敗していませんでした。代わりに、アプリの起動の残りの部分を無視するだけで、shared_task Djangoプロジェクトのアプリケーションからのエントリ

0
shadi

アプリに依存関係の一部が欠けている場合、Celeryはタスクをインポートしません。たとえば、app.viewはnumpyをインストールせずにインポートします。これを確認する最善の方法は、ご存知のように、Djangoサーバーを実行することです。

python manage.py runserver

これにより、それぞれのタスクを格納しているアプリ内でImportErrorsが発生した場合に問題が見つかりました。すべてをpipインストールするか、依存関係を削除して再試行してください。それ以外の場合、これは問題の原因ではありません。

Django-celeryのPeriodicTaskクラスで問題が発生しましたが、実行ごとにセロリワーカーを起動すると名前が正しく表示されました。

KeyError:u'my_app.tasks.run '

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

テーブル 'djcelery_periodictask'をチェックすると、古いエントリが表示され、それらを削除すると問題が修正されました。

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

autodiscover_tasksを使用する場合は、登録するfunctionsが他のファイルではなく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
W.Perrin