我正在设置多个工作线程,这些工作线程在 docker 环境中根据给定的队列执行任务。我无法看到我在 settings.py 中声明的队列
我已经看到顶部(在容器命令中(的工作命令只被执行,其余的没有被执行。
这就是我尝试在 settings.py 中路由芹菜任务的方式
# Celery settings
CELERY_BROKER_URL = 'redis://:secret@redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://:secret@redis:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = TIME_ZONE
CELERY_TASK_ROUTES = {
'app1.tasks.*': {'queue': 'emails'},
'app2.tasks.*': {'queue': 'parser'},
'app3.tasks.task1': {'queue': 'sms'}
}
这就是我编写 tasks.py 文件的方式。
@app.task(bind=True, queue='parser')
def parser(self, extension, data, file):
return True
这就是我在容器中的 docker-compose.yml 文件中给出命令的方式
version: '3.3'
services:
api:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: bash -c 'python3 manage.py makemigrations --noinput &&
python3 manage.py migrate --noinput &&
celery -A app worker -l info -Q email-n worker1 &&
celery -A app worker -l info -Q parser-n worker2 &&
celery -A app worker -l info -Q sms-n worker3 &&
celery -A app worker -l info &&
celery -A app beat -l info &&
python3 manage.py runserver 0.0.0.0:1337'
ports:
- 1337:1337
expose:
- 1337
environment:
- SECRET_KEY = qbsdk08)5&n*x4xdya7fbm0&lb)x!6!f_#ta(y-)*!w_wibc4c
- SQL_ENGINE = django.db.backends.postgresql_psycopg2
- SQL_DATABASE = postgres
- SQL_USER = admin
- SQL_PASSWORD = password
- SQL_HOST = postgres_container
- SQL_PORT = 5432
- DATABASE = postgres
- DJANGO_SETTINGS_MODULE = api.settings
depends_on:
- postgres_container
预期成果: 我希望队列列表显示在控制台中并运行良好
实际结果: 它只显示 docker-compose 文件中给出的第一个任务,在我的情况下,根据 docker-compose 文件的以下命令,其余的将不起作用。
"芹菜 -一个应用程序工作者 -l 信息 -Q 电子邮件-n 工人 1 &&">
技术: 姜戈 v2.2 芹菜 v4 雷迪斯 v5
问题出在启动命令上。 您基本上已经按顺序启动了每个工作线程,因此celery -A app worker -l info -Q parser-n worker2
直到 worker1 退出后才会执行。 解决此问题的最简单方法是为每个工作线程设置单独的 docker 实例。
email-n:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: bash -c 'python3 manage.py makemigrations --noinput &&
python3 manage.py migrate --noinput &&
celery -A app worker -l info -Q email-n worker1'
...
parser-n:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: celery -A app worker -l info -Q parser-n worker2
sms-n:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: celery -A app worker -l info -Q sms-n worker3
celery:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: celery -A app worker -l info
beat:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: celery -A app beat -l info
api:
restart: always
build: ./app
volumes:
- ./app:/app/
depends_on:
- redis
command: python3 manage.py runserver 0.0.0.0:1337
或者,您可以启动一个具有多个队列的工作线程,例如,-Q parser-n,email-n,sms-n
. 最后,您还可以在容器中守护 docker,但是当您准备好停止容器时,您必须有一种优雅的方式来停止守护程序,但这超出了本问题的范围。