0

Я тестирую свой код с докером для многопроцессорной реализации, в которой мне нужны процессы для запуска независимо от родителя, и они просто запускаются до завершения и не нуждаются в том, чтобы передавать что-либо обратно родительскому.Докеры выходят перед тем, как вилка завершает выполнение?

Я реализовал приложение двумя способами на всякий случай, если один разрывается, один с многопроцессорной (mp) библиотекой, другой с простой вилкой (f). Это отлично работает с mp, потому что у него есть инструкции ждать завершения процесса до выхода родителя. Однако я думал, что контейнер будет ждать завершения подпроцессов, даже если родительский выход завершен. Кто-нибудь знает об обходном пути для этого с помощью Docker + fork?

нескольких процессов

imdata = [pools.apply_async(detector_optimized.run_full_detection, (gpu_slot, batch_jobs[gpu_slot][0], 
          batch_jobs[gpu_slot][1], src, dst, ext)) for gpu_slot in xrange(num_jobs)] 

# Wait for all subprocesses to complete 
map(lambda x: x.get(), imdata) 
pools.close() 
pools.join() 

вилки

for gpu_slot in xrange(len(batch_jobs)): 
    pid = os.fork() 
    if pid == 0: 
     detector_optimized.run_full_detection(gpu_slot, batch_jobs[gpu_slot][0], batch_jobs[gpu_slot][1], 
               src, dst, detector_optimized.vars.get_EXTENSION()) 
     os._exit(0) 

Если удалить os._exit (0) линии вилки не выполняются последовательно и больше не параллельно ...

ответ

0

докер контейнер завершается, когда процесс с PID 1 завершается. Любой другой процесс игнорируется. Если у вас несколько процессов в контейнере, вы можете использовать инструмент, ожидающий завершения всех процессов, а затем выйти. У этого инструмента будет PID 1. Вы можете проверить Supervisor, Monit, Chaperone.