我尝试从命令行启动Celery worker服务器:
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)
答案 0 :(得分:21)
我忘了在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
答案 1 :(得分:9)
Celery使用celery
文件存储应用程序的配置,你不能只给python文件包含任务并启动芹菜。
您应该定义celery
文件(对于Celery&gt; 3.0;以前它是celeryconfig.py
)..
celeryd --app app.celery -l info
此示例如何使用app/celery.py
以下是芹菜文件的示例:https://github.com/Kami/libcloud-sandbox/blob/master/celeryconfig.py
答案 2 :(得分:5)
对于因明显不同原因而收到相同错误消息的任何人,请注意,如果初始化文件中的任何导入失败,您的应用程序将提升这个完全不明确的AttributeError
而不是最初导致的异常它
答案 3 :(得分:2)
运行celery -A tasks worker --loglevel=info
时,您的celery应用应在模块tasks
中公开。不应将其包装在函数或if
语句中。
如果您make_celery
在另一个文件中,则应将celery应用程序导入要传递给celery的文件中。
答案 4 :(得分:1)
尝试开始芹菜:
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//')
答案 5 :(得分:1)
我的问题是我将celery
变量放在了一个主要函数中:
if __name__ == '__main__': # Remove this row
app = Flask(__name__)
celery = make_celery(app)
什么时候应该放在外面。