节拍调度程序不会自动工作,但在手动触发时会工作

问题描述 投票:0回答:1

我正在学习使用芹菜。我想使用beat 自动化API 触发器。如果我从 shell 手动调用

increment_value.delay()
,则以下代码有效。但是,它不会自动化。另外,我认为 Redis 仍然会每隔一段时间进行更新。只是任务方法没有被调用。

config.py

broker_url = f'redis://{REDIS_IP}:6379/0'
result_backend = f'redis://{REDIS_IP}:6379/0'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'UTC'

CELERY_BEAT_SCHEDULE = {
    'run-every-15-seconds': {
        'task': 'scheduler.increment_value',
        'schedule': timedelta(seconds=15),
    },
}

调度程序.py

app = Celery()
app.config_from_object('config')


@app.task
def increment_value():
    response = requests.post(url=f"http://{FASTAPI_IP}:8000/redis/first")

    logging.info("Task Has Been Triggered")

    return response.json()

Dockerfile

FROM python:3.8-slim

WORKDIR /app

# Copy only the necessary files
COPY ./requirements.txt /app/requirements.txt
COPY . /app

# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Start Celery worker and beat in the background using a shell script
COPY ./start.sh /app/start.sh
RUN chmod +x /app/start.sh

CMD ["/app/start.sh"]

start.sh

#!/bin/sh
celery -A scheduler worker --loglevel=info &
celery -A scheduler beat --loglevel=info

当我运行应用程序时,

worker
beat
都会启动。

我还应该提到我正在开发 WSL2。

如果有人能向我指出我做错了什么,我将非常感激。

python dockerfile celery wsl-2 celerybeat
1个回答
0
投票

要运行 docker 容器,运行进程的 pid 必须为

1
。 你的芹菜应用程序可能会在后台运行。

您也只能运行一项服务作为前台。

您也可以使用过程控制设置。

Supervisord
是进程控制系统,它将根据容器运行的需要作为 pid
1
运行,并且它可以管理 celery 工作程序和调度程序上的执行。

© www.soinside.com 2019 - 2024. All rights reserved.