我正在学习使用芹菜。我想使用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。
如果有人能向我指出我做错了什么,我将非常感激。
要运行 docker 容器,运行进程的 pid 必须为
1
。
你的芹菜应用程序可能会在后台运行。
您也只能运行一项服务作为前台。
您也可以使用过程控制设置。
Supervisord
是进程控制系统,它将根据容器运行的需要作为 pid 1
运行,并且它可以管理 celery 工作程序和调度程序上的执行。