UDATE3:发现了这个问题.请参阅以下答案.
UPDATE2:似乎我可能通过manage.py shell运行djcelery教程来处理自动命名和相对导入问题,见下文.它仍然不适合我,但现在我收到新的日志错误消息.见下文.
更新:我在帖子的底部添加了日志.似乎示例任务没有注册?
原帖:
我想让django-芹菜起来跑步.我无法通过这个例子.
我成功安装了rabbitmq,并且没有遇到任何麻烦:http://www.rabbitmq.com/getstarted.html
然后我尝试通过djcelery教程.
当我运行时,python manage.py celeryd -l info我收到消息:[任务] - app.module.add [2011-07-27 21:17:19,990:警告/主程序]芹菜@sequoia已经启动.
所以看起来不错.我把它放在我的设置文件的顶部:
import djcelery
djcelery.setup_loader()
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"
Run Code Online (Sandbox Code Playgroud)
将这些添加到我安装的应用中:
'djcelery',
Run Code Online (Sandbox Code Playgroud)
这是我的app的tasks文件夹中的tasks.py文件:
from celery.task import task
@task()
def add(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
我把它添加到我的django.wsgi文件中:
os.environ["CELERY_LOADER"] = "django"
Run Code Online (Sandbox Code Playgroud)
然后我在命令行输入了这个:
>>> from app.module.tasks import add
>>> result = add.delay(4,4)
>>> result
(AsyncResult: 7auathu945gry48- a bunch of stuff) …Run Code Online (Sandbox Code Playgroud) 我开始使用Celery和Python,我有一个问题可能非常简单,但我似乎无法找到任何合适的答案......
如果我有一堆任务,并且其中一个抛出异常,是否有办法检索传递给所述任务的参数?
例如,如果我想获取一些主机名解析的IP,我创建一个任务......
@tasks_app.task
def resolve_hostname(hostname):
return (hostname, {hst.address for hst in dns.resolver.query(hostname)})
Run Code Online (Sandbox Code Playgroud)
...可以抛出异常,是否有一种方法可以在hostname异常发生时将该参数的值置于调用之外?
假设我将任务分组如下:
ip_subtasks = group(
resolve_hostname.s(hostname) for hostname in ['google.com',
'yahoo.com',
'failure.kommm']
)()
Run Code Online (Sandbox Code Playgroud)
最后一个(试图解决failure.kommm)将引发异常.我想get()将芹菜任务的方法放在一个try/catch,并在尝试解决failure.kommm(如下所示)时显示一条消息说出现问题:
for ip_subtask in ip_subtasks:
try:
hostname, ips = ip_subtask.get(timeout=45)
except dns.exception.DNSException, e:
# I WISHED THIS WORKED:
logger.exception("Something happened when trying"
" to resolve %s" % ip_subtask.args[0])
Run Code Online (Sandbox Code Playgroud)
所以,这就是问题......如果我有任务实例本身,有没有办法检索任务执行的参数?
先感谢您.
我已经安装了Celery,并且正在尝试使用Celery First Steps Doc对其进行测试。
我尝试将Redis和RabbitMQ都用作代理和后端,但无法获得结果:
result.get(timeout = 10)
Run Code Online (Sandbox Code Playgroud)
每次,我都会收到此错误:
Traceback (most recent call last):
File "<input>", line 11, in <module>
File "/home/mehdi/.virtualenvs/python3/lib/python3.4/site-packages/celery/result.py", line 169, in get
no_ack=no_ack,
File "/home/mehdi/.virtualenvs/python3/lib/python3.4/site-packages/celery/backends/base.py", line 225, in wait_for
raise TimeoutError('The operation timed out.')
celery.exceptions.TimeoutError: The operation timed out.
Run Code Online (Sandbox Code Playgroud)
经纪人部分似乎工作得很好:当我运行这段代码时
from celery import Celery
app = Celery('tasks', backend='redis://localhost/', broker='amqp://')
@app.task
def add(x, y):
return x + y
result = add.delay(4,4)
Run Code Online (Sandbox Code Playgroud)
我得到了(按预期)
[2015-08-04 12:05:44,910:INFO / MainProcess]收到的任务:tasks.add [741160b8-cb7b-4e63-93c3-f5e43f8f8a02]
[2015-08-04 12:05:44,911:INFO / MainProcess]任务task.add [741160b8-cb7b-4e63-93c3-f5e43f8f8a02]成功0.0004287530000510742s:8
PS:我正在使用Xubuntu 64bit
编辑: …