コマンドラインからCeleryワーカーサーバーを起動しようとしました。
celery -A tasks worker --loglevel=info
Tasks.pyのコード:
import os
os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"
from celery import task
@task()
def add_photos_task( lad_id ):
...
次のエラーが表示されます:
Traceback (most recent call last):
File "/usr/local/bin/celery", line 8, in <module>
load_entry_point('celery==3.0.12', 'console_scripts', 'celery')()
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/__main__.py", line 14, in main
main()
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 946, in main
cmd.execute_from_commandline(argv)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/celery.py", line 890, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 177, in execute_from_commandline
argv = self.setup_app_from_commandline(argv)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 295, in setup_app_from_commandline
self.app = self.find_app(app)
File "/usr/local/lib/python2.7/site-packages/celery-3.0.12-py2.7.Egg/celery/bin/base.py", line 313, in find_app
return sym.celery
AttributeError: 'module' object has no attribute 'celery'
「セロリ」属性が見つからない理由を誰かが知っていますか?ご協力ありがとう御座います。
オペレーティングシステムはLinux Debian 5です。
編集。手がかりかもしれません。誰かが私に関数への次のコメントを説明してもらえますか?
# from celery/utils/imports.py
def import_from_cwd(module, imp=None, package=None):
"""Import module, but make sure it finds modules
located in the current directory.
Modules located in the current directory has
precedence over modules located in `sys.path`.
"""
if imp is None:
imp = importlib.import_module
with cwd_in_path():
return imp(module, package=package)
Tasks.pyでセロリオブジェクトを作成するのを忘れました:
from celery import Celery
from celery import task
celery = Celery('tasks', broker='amqp://guest@localhost//') #!
import os
os.environ[ 'Django_SETTINGS_MODULE' ] = "proj.settings"
@task()
def add_photos_task( lad_id ):
...
その後、通常はタスクを開始できます。
celery -A tasks worker --loglevel=info
Celeryはアプリの設定を保存するためにcelery
ファイルを使用します。タスクを含むpythonファイルを指定して、Celeryを起動するだけではできません。celery
ファイルを定義する必要があります。 (Celery> 3.0の場合、以前はceleryconfig.py
でした)。
celeryd --app app.celery -l情報
この例では、app/celery.py
にある構成ファイルでセロリを開始する方法
これがセロリファイルの例です: https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py
明らかに異なる理由で同じエラーメッセージが表示される場合は、初期化ファイルのインポートのいずれかが失敗すると、アプリは最初にそれを引き起こした例外ではなく、完全にあいまいなAttributeError
を発生させることに注意してください。
celery -A tasks worker --loglevel=info
を実行すると、セロリアプリがモジュールtasks
で公開されます。関数やif
ステートメントでラップしないでください。
別のファイルでmake_celery
を使用している場合は、セロリアプリをセロリに渡すファイルにインポートする必要があります。
私の問題は、celery
変数をメイン関数内に置くことでした:
if __name__ == '__main__': # Remove this row
app = Flask(__name__)
celery = make_celery(app)
外に出すべき時。
セロリを始めてみてください:
celeryd --config=my_app.my_config --loglevel=INFO --purge -Q my_queue
私のtasks.py
に次のスクリプトがあります:
@task(name="my_queue", routing_key="my_queue")
def add_photos_task( lad_id ):
my_config.py
に次のスクリプトがあります:
CELERY_IMPORTS = \
(
"my_app.tasks",
)
CELERY_ROUTES = \
{
"my_queue":
{
"queue": "my_queue"
},
}
CELERY_QUEUES = \
{
"my_queue":
{
"exchange": "my_app",
"exchange_type": "direct",
"binding_key": "my_queue"
},
}
celery = Celery(broker='amqp://guest@localhost//')