Я использую Supervisord с Celery на сервере торнадо (примечание: не tcelery, поскольку мой сервер еще не использует никаких функций async) с тремя рабочими процессами: w1, w2 и w3. У каждого есть параллелизм 10. Я делаю это через супервизор, добавляя следующее в /etc/supervisord.conf:
[program:sendgrid_gateway_server]
command=sudo python main.py -o runserver
numprocs=1
directory=/home/ubuntu/sendgrid_gateway/sendgrid-gateway
stdout_logfile=/home/ubuntu/sendgrid_gateway/sendgrid-gateway/logs/server_log.txt
autostart=true
autorestart=true
user=root
[program:sendgrid_gateway_server_w1]
command=celery worker -A tasks --loglevel=INFO --concurrency=10 -n w1
numprocs=1
directory=/home/ubuntu/sendgrid_gateway/sendgrid-gateway
stdout_logfile=/home/ubuntu/sendgrid_gateway/sendgrid-gateway/logs/w1_log.txt
autostart=true
autorestart=true
user=root
[program:sendgrid_gateway_server_w2]
command=celery worker -A tasks --loglevel=INFO --concurrency=10 -n w2
numprocs=1
directory=/home/ubuntu/sendgrid_gateway/sendgrid-gateway
stdout_logfile=/home/ubuntu/sendgrid_gateway/sendgrid-gateway/logs/w2_log.txt
autostart=true
autorestart=true
user=root
[program:sendgrid_gateway_server_w3]
command=celery worker -A tasks --loglevel=INFO --concurrency=10 -n w3
numprocs=1
directory=/home/ubuntu/sendgrid_gateway/sendgrid-gateway
stdout_logfile=/home/ubuntu/sendgrid_gateway/sendgrid-gateway/logs/w3_log.txt
autostart=true
Первый блок [program] предназначен для моего основного приложения Python, которое запускает Tornado. Следующие три (очевидно) мои рабочие сельдерея. Что меня беспокоит, так это то, что когда я "supervisorctl start all", в списке появляются все 30 процессов:
Это 30 процессов Celery, плюс несколько дополнительных (не совсем понимаю, почему они есть ...). У меня создалось впечатление, что ненужные процессы должны завершаться после завершения задачи. Это так или я просто псих?
Заранее спасибо.
Да, все они должны отображаться как процессы. Однако вы можете использовать параметры stopasgroup = true и killasgroup = true в конфигурациях вашей программы, чтобы сразу остановить все дочерние процессы, иначе они могут продолжать работать даже после того, как вы выполнили команду stop [programname] с помощью supervisorctl.