[英]Tasks Stuck in Celery Queue
我一直在嘗試使用位於 Redis 之上的 Redis Queue 來實現一個任務隊列。 我擺脫了這一點,並根據我在此處描述的問題在 RabbitMQ 之上使用 Celery: Redis 隊列阻塞
我參考了上面的(未回答的)SO 問題,因為我相信這兩個問題非常相似,可以潛在地聯系起來——無論是代碼還是我的設置。
我能夠將任務發送到我的 Celery 隊列,並且能夠通過在我的 Rabbit rabbitmqctl list_queues
容器 bash 中調用rabbitmqctl list_queues
或調用
>>> add_nums.delay(2,3)
<AsyncResult: 197315b1-e18b-4945-bf0a-cc6b6b829bfb>
>>> result = add_nums.AsyncResult( 197315b1-e18b-4945-bf0a-cc6b6b829bfb)
在哪里
>>> result.status
'PENDING'
無論我檢查多少次。
我嘗試在裝飾器調用中添加ignore_result=True
,但這沒有效果。
我的工人階級:
./workerA.py
from celery import Celery
from celery.utils.log import get_task_logger
logger = get_task_logger( __name__)
# Celery configuration
CELERY_BROKER_URL = 'amqp://***:***@rabbit:5672/' #where the asterisks indicate user, pwd
CELERY_RESULT_BACKEND = 'rpc://'
# Initialize celery
celery = Celery( 'workerA',
broker=CELERY_BROKER_URL,
backend=CELERY_RESULT_BACKEND)
@celery.task( ignore_result=True)
def add_nums( a, b):
logger.info( f'{ a+b=}')
return a+b
我的主要:
./app.py
import logging
from flask.logging import default_handler
from workerA import add_nums
from workerB import sub_nums
from flask import (
Flask,
request,
jsonify,
)
logger = logging.getLogger( )
logger.addHandler( default_handler)
logger.setLevel( logging.INFO)
app = Flask( __name__)
@app.route( '/')
def index():
return 'hello world!'
@app.route( '/add')
def add():
logger.info( 'in add method')
first_num, second_num = ( 1,2)
logger.info( f' { first_num=}')
result = add_nums.delay( first_num, second_num)
logger.info( f' {result=}')
logger.info( f' {result.state=}')
return jsonify({ 'result': result.result}), 200
@app.route( '/subtract')
def subtract():
logger.info( 'in sub method')
first_num, second_num = ( 1,2)
result = sub_nums.delay( first_num, second_num)
logger.info( f' {result=}')
return jsonify( {'result': result.result}), 200
if __name__ == '__main__':
app.run( debug=True)
調用result.get( timeout=n)
總是會導致超時,無論 n 設置多高:簡而言之,這些隊列永遠不會得到滿足。
為了完整起見,我的 docker-compose.yml:
version: "3"
services:
web:
build:
context: .
dockerfile: Dockerfile
restart: always
ports:
- 5000:5000
command: python ./app.py -h 0.0.0.0
depends_on:
- rabbit
volumes:
- .:/app
rabbit:
hostname: rabbit
image: rabbitmq:management
environment:
- RABBITMQ_DEFAULT_USER=***
- RABBITMQ_DEFAULT_PASS=***
ports:
- "5673:5672"
- "15672:15672"
worker_1:
build:
context: .
hostname: worker_1
entrypoint: celery
command: -A workerA worker --loglevel=info -Q workerA
volumes:
- .:/app
links:
- rabbit
depends_on:
- rabbit
worker_2:
build:
context: .
hostname: worker_2
entrypoint: celery
command: -A workerB worker --loglevel=info -Q workerB
volumes:
- .:/app
links:
- rabbit
depends_on:
- rabbit
和我的 Dockerfile:
FROM python:3
ADD requirements.txt /app/requirements.txt
WORKDIR /app/
RUN pip install -r requirements.txt
EXPOSE 5000
我正在使用 Mac 2.2.0.0 的 Docker 桌面,我的 OSX 是 10.15.2(Catalina)
對這個問題的任何幫助都將不勝感激。 這些隊列問題現在已經成為我的嚴重障礙
看起來這個問題的原因是因為沒有配置的后端來存儲結果。 使用 Celery(..., backend='rpc://') 實例化 Celery 對象似乎除了沉默“NotImplementedError: No result backend is configured”錯誤之外別無他法,否則你會得到。 我認為這個意義上的文檔具有誤導性。
開始試用 Redis 結果后端以提高性能。 我的應用程序的其他地方也使用了 Elasticsearch 和 MongoDB,我可以將其作為目標,但更喜歡 Redis。 完成后,午餐后將反饋結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.