我安装了Celery(最新的稳定版本.)我有一个名为的目录/home/myuser/fable/jobs.在这个目录中,我有一个名为tasks.py的文件:
from celery.decorators import task
from celery.task import Task
class Submitter(Task):
def run(self, post, **kwargs):
return "Yes, it works!!!!!!"
Run Code Online (Sandbox Code Playgroud)
在这个目录中,我还有一个名为celeryconfig.py的文件:
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "abc"
BROKER_PASSWORD = "xyz"
BROKER_VHOST = "fablemq"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
Run Code Online (Sandbox Code Playgroud)
在我/etc/profile,我把这些设置为我的PYTHONPATH:
PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs所以我使用console($ celeryd --loglevel=INFO)运行我的Celery工作器,然后尝试一下.我打开Python控制台并导入任务.然后,我运行提交者.
>>> import fable.jobs.tasks as tasks
>>> s = tasks.Submitter()
>>> s.delay("abc")
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987>
Run Code Online (Sandbox Code Playgroud)
一切正常,正如您在我的控制台中看到的那样
[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s:
Run Code Online (Sandbox Code Playgroud)
但是当我进入我的Django的views.py并运行上面的3行代码时,我得到了这个:
[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown …Run Code Online (Sandbox Code Playgroud) 我有 Celery 3.1.18 与 Django 1.6.11 和 RabbitMQ 3.5.4 一起运行,并尝试在失败状态下测试我的异步任务(CELERY_ALWAYS_EAGER=True)。但是,我无法在错误回调中获得正确的“结果”。Celery 文档中的示例显示:
@app.task(bind=True)
def error_handler(self, uuid):
result = self.app.AsyncResult(uuid)
print('Task {0} raised exception: {1!r}\n{2!r}'.format(
uuid, result.result, result.traceback))
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我的结果仍然是“PENDING”、result.result = ''和result.traceback=''。但我的调用返回的实际结果.apply_async具有正确的“FAILURE”状态和回溯。
我的代码(基本上是一个 Django Rest Framework RESTful 端点,它解析 .tar.gz 文件,然后在文件解析完成后向用户发送通知):
视图.py:
from producer_main.celery import app as celery_app
@celery_app.task()
def _upload_error_simple(uuid):
print uuid
result = celery_app.AsyncResult(uuid)
print result.backend
print result.state
print result.result
print result.traceback
msg = 'Task {0} raised exception: {1!r}\n{2!r}'.format(uuid,
result.result,
result.traceback)
class UploadNewFile(APIView):
def …Run Code Online (Sandbox Code Playgroud)