2016-04-12 13 views
0

Ich teste meinen Code mit Docker für eine Multi-Prozess-Implementierung, die ich die Prozesse unabhängig von seinem übergeordneten ausführen müssen und sie einfach ausgeführt werden, um keine zurück zu dem übergeordneten zu kommunizieren.Docker wird beendet, bevor fork die Ausführung beendet?

Ich habe die Anwendung auf zwei Arten implementiert, nur für den Fall, dass einer bricht, eine mit Multiprocessing (mp) -Bibliothek, die andere mit einer einfachen Gabel (f). Dies funktioniert perfekt mit mp, weil es Anweisungen gibt, auf den Prozess zu warten, bevor das Eltern-Exit abgeschlossen ist. Ich dachte jedoch, dass der Container darauf warten würde, dass die Teilprozesse abgeschlossen werden, selbst wenn das übergeordnete Element beendet wird. Kennt jemand einen Workaround dafür mit Docker + fork?

Mehrprozess

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() 

fork

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) 

Wenn ich die os._exit (0) zu entfernen Linie die Gabeln sequentiell ausführen und nicht mehr parallel ...

Antwort

0

Der Behälter Docker beendet, wenn der Prozess mit PID 1 beendet wird. Jeder andere Prozess wird ignoriert. Wenn Sie mehrere Prozesse in einem Container haben, können Sie ein Tool verwenden, das darauf wartet, dass alle Prozesse abgeschlossen werden, und dann beenden. Dieses Werkzeug hätte die PID 1. Sie können Supervisor, Monit, Chaperone überprüfen.

Verwandte Themen