我正在尝试让结果后端在我正在处理的项目的本地计算机上工作,但遇到了问题.
目前,我正在尝试创建一个队列系统,以便我的实验室创建案例.这是为了防止使用重复的序列号.我已经在使用Celery进行打印了,所以我想我将创建一个新的Celery队列并使用它来处理案件.前端还需要获取案例创建的结果,以显示创建的案例编号.
我正在遵循上述有关配置Celery的教程.以下是来源:
celeryconfig.py:
from kombu import Queue
CELERY_DEFAULT_QUEUE = 'celery'
CELERY_DEFAULT_EXCHANGE = 'celery'
CELERY_DEFAULT_EXCHANGE_TYPE = 'direct'
CELERY_RESULT_BACKEND = 'rpc://'
CELERY_RESULT_PERSISTENT = False
CELERY_QUEUES = (
Queue('celery', routing_key="celery"),
Queue('case_creation', routing_key='create.#')
)
CELERY_ROUTES = {
'case.tasks.create_case': {
'queue': 'case_creation',
'routing_key': 'create.1'
},
'print.tasks.connect_and_serve': {
'queue': 'celery',
'routing_key': 'celery'
}
}
celery.py:
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings.local')
app = Celery('proj', broker='amqp://guest@localhost//')
app.config_from_object('proj.celeryconfig')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
task.py:
import celery
from django.db import IntegrityError
from case.case_create import CaseCreate
@celery.task(bind=True)
def create_case(self, data, user, ip):
try:
acc = CaseCreate(data, user, ip)
return acc.begin()
except IntegrityError as e:
self.retry(exc=e, countdown=2)
这是调用上述任务的视图:
@require_authentication()
@requires_api_signature()
@csrf_exempt
@require_http_methods(['POST'])
def api_create_case(request):
result = create_case.delay(json.loads(request.body.decode('utf-8')), request.user, get_ip_address(request))
print(str(result)) # Prints the Task ID
print(str(result.get(timeout=1))) # Throws error
return HttpResponse(json.dumps({'result': str(result)}), status=200)
我使用以下命令启动芹菜队列:
celery -A proj worker -Q case_creation -n case_worker -c 1
当我运行celery worker时,我确实在config下看到结果:
-------------- celery@case_worker v3.1.16 (Cipater)
---- **** -----
--- * *** * -- Windows-8-6.2.9200
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: proj:0x32a2990
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: rpc://
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> case_creation exchange=celery(direct) key=create.#
当我运行程序并提交新案例时,这是我收到的错误消息:
No result backend configured. Please see the documentation for more information.
我已经尝试过可以在网上找到的每件事.有没有人可以指出我正确的方向?我非常亲密,对查看此代码非常厌倦.
解决方法:
app = Celery('proj', backend='amqp', broker='amqp://guest@localhost//')
编辑
Make sure the client is configured with the right backend.
If for some reason the client is configured to use a different backend than the worker, you will not be able to receive the result, so make sure the backend is correct by inspecting it:
试试看这个输出:
>>> result = task.delay(…)
>>> print(result.backend)
其他解决方案将代替
app = Celery('proj',
backend='amqp',
broker='amqp://',
include=['proj.tasks'])
尝试:
app = Celery('proj',
broker='amqp://',
include=['proj.tasks'])
app.conf.update(
CELERY_RESULT_BACKEND='amqp'
)
标签:celery,python,django
来源: https://codeday.me/bug/20191026/1938450.html