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'
何が問題なのか説明してください。
celery.registry.TaskRegistry
クラスで、登録済みタスクの現在のリストを確認できます。 celeryconfig(現在のディレクトリ内)がPYTHONPATH
にないため、celeryがそれを見つけられず、デフォルトにフォールバックする可能性があります。セロリを開始するときに、明示的に指定するだけです。
celeryd --loglevel=INFO --settings=celeryconfig
--loglevel=DEBUG
を設定することもでき、おそらくすぐに問題が表示されるはずです。
ワーカーサーバーを再起動する必要があると思います。私は同じ問題に出会い、再起動することで解決します。
私は同じ問題を抱えていました:_"Received unregistered task of type.."
_の理由は、celerydサービスがサービス開始時にタスクを見つけて登録しなかったためです(ただし、_./manage.py celeryd --loglevel=info
_を開始するとリストが表示されます)。
これらのタスクは、設定ファイルのCELERY_IMPORTS = ("tasks", )
で宣言する必要があります。
特殊な_celery_settings.py
_ファイルがある場合、digivampireが書いたように、_--settings=celery_settings.py
_としてcelerydサービスの開始時に宣言する必要があります。
CELERY_IMPORTS
またはautodiscover_tasks
のどちらを使用する場合でも、重要なポイントはタスクが見つかり、Celeryに登録されているタスクの名前がワーカーが取得しようとする名前と一致する必要があることです。
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
、--config
、celeryconfig
、またはconfig_from_object
のいずれかで、セロリの設定がタスクを正しくインポートしていることを確認してください。
セロリビートを使用している場合は、CELERYBEAT_SCHEDULE
で使用するタスク名task
がセロリタスクリストの名前と一致することを確認してください。
私も同じ問題を抱えていました。追加した
CELERY_IMPORTS=("mytasks")
私のceleryconfig.py
ファイルで解決します。
私にとって、このエラーは、タスクを含むアプリがDjangoのINSTALLED_APPS設定に含まれるようにすることで解決しました。
--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",)
スーパーバイザーを使用してセロリをデーモンとして起動しているため、私のセットアップは少し複雑でした。
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"、)
他のモジュールでタスクを呼び出してください!!!!!!!!
私のために働いたのは、セロリタスクデコレータに明示的な名前を追加することでした。タスク宣言を_@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 !!!!")
_
奇妙なことに、これはパッケージの欠落が原因である可能性もあります。 pipを実行して、必要なすべてのパッケージをインストールします:pip install -r requirements.txt
autodiscover_tasks
は、不足しているパッケージを使用するタスクをピックアップしていませんでした。
Celery Beatからタスクを実行するのと同じ問題がありました。セロリは相対的なインポートが好きではないので、私のceleryconfig.py
、完全なパッケージ名を明示的に設定する必要がありました。
app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'full.path.to.add',
'schedule': 30.0,
'args': (16, 16)
},
}
私もこの問題に遭遇しましたが、まったく同じではないので、参考にしてください。最近のアップグレードでは、このデコレータ構文が原因でこのエラーメッセージが表示されます。
_ERROR/MainProcess] Received unregistered task of type 'my_server_check'.
_
@task('my_server_check')
に変更する必要がありました
@task()
理由はわかりません。
Djangoでは問題ありませんでした。しかし、Flaskを使用しているときにこれに遭遇しました。解決策は設定オプションを設定することでした。
celery worker -A app.celery --loglevel=DEBUG --config=settings
djangoの場合、次のようになりました。
python manage.py celery worker -c 2 --loglevel=info
この種のエラーが発生している場合、考えられる原因はいくつかありますが、解決策は、/ etc/defaults/celerydのceleryd構成ファイルが特定のDjangoプロジェクト: celery docs で指定された形式に変換するとすぐに、すべてがうまくいきました。
この行を/ 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"
本当に便利なリストへの追加アイテム。
Celeryはタスクのエラーに関連して容赦ない(または少なくとも適切なログエントリをトレースできなかった)ことを発見し、それらを登録しません。 Celeryをサービスとして実行する際に多くの問題が発生しましたが、主に権限に関連しています。
ログファイルへの書き込み権限に関連する最新のもの。開発やコマンドラインでのセロリの実行に問題はありませんでしたが、サービスはタスクを未登録として報告しました。
ログフォルダーのアクセス許可を変更して、サービスが書き込みできるようにする必要がありました。
問題に対する答えは、質問で提供した出力の最初の行/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にない可能性が高いです。
私の問題を解決しました。「タスク」はpythonパッケージ名 'celery_task'の下にあります。このパッケージを終了し、コマンドcelery worker -A celery_task.task --loglevel=info
を実行すると動作します。
ファイルタスクへの正しいパスを書く
app.conf.beat_schedule = {
'send-task': {
'task': 'appdir.tasks.testapp',
'schedule': crontab(minute='*/5'),
},
}
プログラマーの1人が、インポートの1つに次の行を追加したことがわかりました。
os.chdir(<path_to_a_local_folder>)
これにより、Celeryワーカーは、作業ディレクトリをプロジェクトのデフォルトの作業ディレクトリ(タスクを見つけることができる場所)から別のディレクトリ(タスクを見つけることができない場所)に変更しました。
このコード行を削除した後、すべてのタスクが見つかり、登録されました。
このエラーで私のケースに2セントを追加するだけで...
私のパスは、/vagrant/devops/test
とapp.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
のように実行すると、すべて問題ありません。
「celery -A conf worker -l info」コマンドでセロリを実行すると、すべてのタスクがログにリストされました。 conf.celery.debug_taskこの正確なタスクパスを指定していなかったため、エラーが発生していました。そのため、正確なタスクIDをコピーして貼り付けて、これを再確認してください。
私の場合、エラーは、1つのコンテナーがdocker-composeを使用してホストファイルシステムにマウントされたフォルダーにファイルを作成したためでした。
ホストシステムのコンテナによって作成されたファイルを削除するだけで、プロジェクトを再び起動することができました。
Sudo rm -Rfフォルダー名
(ファイルはルートユーザーが所有していたため、Sudoを使用する必要がありました)
Dockerバージョン:18.03.1
Celeryは相対インポートをサポートしていないため、celeryconfig.pyでは絶対インポートが必要です。
CELERYBEAT_SCHEDULE = {
'add_num': {
'task': 'app.tasks.add_num.add_nums',
'schedule': timedelta(seconds=10),
'args': (1, 2)
}
}
私の2セント
Alpineを使用して、これをdockerイメージで取得していました。 Django設定参照/dev/log
syslogへのロギング用。 Djangoアプリとセロリのワーカーは両方とも同じ画像に基づいていました。Djangoアプリ画像のエントリポイントは起動時にsyslogd
しかし、セロリ労働者用ではありませんでした。これは、./manage.py Shell
が存在しないため失敗する/dev/log
。セロリ労働者は失敗していませんでした。代わりに、アプリの起動の残りの部分を無視するだけで、shared_task
Djangoプロジェクトのアプリケーションからのエントリ
アプリに依存関係の一部が欠けている場合、Celeryはタスクをインポートしません。たとえば、app.viewはnumpyをインストールせずにインポートします。これを確認する最善の方法は、ご存知のように、Djangoサーバーを実行することです。
python manage.py runserver
これにより、それぞれのタスクを格納しているアプリ内でImportErrorsが発生した場合に問題が見つかりました。すべてをpipインストールするか、依存関係を削除して再試行してください。それ以外の場合、これは問題の原因ではありません。
Django-celeryのPeriodicTaskクラスで問題が発生しましたが、実行ごとにセロリワーカーを起動すると名前が正しく表示されました。
KeyError:u'my_app.tasks.run '
私のタスクは、「run」というメソッドだけではなく、「CleanUp」という名前のクラスでした。
テーブル 'djcelery_periodictask'をチェックすると、古いエントリが表示され、それらを削除すると問題が修正されました。
app = Celery(__name__, broker=app.config['CELERY_BROKER'],
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])
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.
"""