我正在使用docker测试我的代码以实现多进程实现,我需要独立于其父进程运行它们,并且它们只是运行完成而不需要将任何内容传回给父进程。
我已经以两种方式实现了应用程序,以防万一中断,一个使用多处理(mp)库,另一个使用简单的fork(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)行,那么forks按顺序执行,不再并行执行...
答案 0 :(得分:0)
当PID 1的进程退出时,Docker容器退出。任何其他进程都将被忽略。 如果容器中有多个进程,则可以使用等待所有进程完成的工具,然后退出。该工具将具有PID 1。 您可以查看Supervisor,Monit,Chaperone。