簡體   English   中英

任務卡在 Celery 隊列中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM