У меня трудоемкая задача Python , выполняемая асинхронно с сельдереем и подпроцессом.Этот процесс сельдерея также демонизируется с помощью супервизора.
Код задачи Python:
cmd = 'python' \
+ ' DRScompute.py' \
+ ' --iImage=' + local_filename_image \
+ ' --iData=' + local_filename_annotations \
+ ' --oData=' + output_json_path \
+ ' --oImage=' + output_image_path
print 'Command:', cmd
p = sub.Popen(cmd.split(), stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print output
rc = p.wait()
Если я запускаю эту задачу Python непосредственно из терминала (см. Команду ниже) Она выполняет задачуотлично.
команда celery:
celery worker -A tasks --loglevel=INFO --concurrency=1 -n worker
Однако, если я демонизирую этот процесс celery с супервизором (см. конфигурацию ниже) Он выполняетзадача, но следует выполнение оставшегося кода до завершения задачи.
Конфигурация супервизора:
[program:celery]
command=celery worker -A tasks --loglevel=INFO --concurrency=1 -n worker
directory=/home/admin/creta
user=admin
numprocs=1
stdout_logfile=/home/admin/creta/logs/celery-worker.log
stderr_logfile=/home/admin/creta/logs/celery-worker.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; Set Celery priority higher than default (999)
; so, if rabbitmq is supervised, it will start first.
priority=1000
Поэтому, когда я использую супервизор, выполняется задача Python подпроцесса, но она переходит к оставшемуся коду перед завершением трудоемкой задачи.,