2016-04-12 34 views
0

私は自分のコードをドッカーでテストしています。マルチプロセスの実装では、プロセスを親プロセスと独立して実行する必要があり、プロセスが完了するまで実行され、親プロセスに何も通知する必要はありません。フォークが完了する前にDockerが終了しますか?

私は2つの方法でアプリケーションを実装しました.1つはブレーク、もう1つはマルチプロセッシング(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) 

Iはos._exitを削除した場合(0)フォークを並列に順次もはや実行しないライン...

答えて

0

ドッカー容器PID 1のプロセスが終了すると終了します。他のプロセスは無視されます。 コンテナ内に複数のプロセスがある場合は、すべてのプロセスが完了するのを待つツールを使用して終了することができます。そのツールはPID 1を持ちます。 Supervisor、Monit、Chaperoneをチェックできます。

関連する問題