我们可以在Docker中运行多进程程序吗?

问题描述:

我有使用多进程像这样的代码:我们可以在Docker中运行多进程程序吗?

import multiprocessing 
from multiprocessing import Pool 

pool = Pool(processes=100) 
result = [] 

for job in job_list:   
    result.append( 
     pool.apply_async(
      handle_job, (job) 
      ) 
     ) 
pool.close() 
pool.join() 

这档节目非常大的数据集做繁重的计算。所以我们需要多进程来同时处理这个工作以提高性能。

我被告知,对于主机系统,一个码头集装箱只是一个过程。所以我想知道我的多进程如何在Docker中处理?

下面是我的关心:

  1. 由于容器只是一个过程,我会多进程代码成为多线程程序?

  2. 表现会下降吗?因为我使用多进程的原因是同时完成工作以获得更好的性能。

泊坞窗包括命名空间的进程ID和运行多个完整支持内核进程。在容器内部,您可以运行ps来查看隔离的进程列表(这通常只是您的shell和ps命令)。

运行单个应用程序的docker的描述是将应用程序隔离技术与更熟悉的OS虚拟化工具分开,在那里您将在后台启动Web服务器,邮件服务器,ssh守护程序等。

谨慎的几句话:

  • 一旦PID 1退出,你的容器两端,不管你的派生进程是否仍在运行与否。
  • 如果没有init,退出的父进程没有收到的进程将保持为僵尸(它们不会传递命名空间隔离来到达主机init进程)。如果这是一个问题(tini github repo),您可以运行一个tini应用程序作为入口点以清理这些应用程序。
+0

我试着理解你的话。所以你的意思是码头支持多处理。但是这些进程被进程命名空间隔离,所以我们无法在Docker容器外看到它们,对吧? –

+0

进程隔离意味着容器内的进程无法看到主机,他们只会看到自己正在运行。但主机将能够看到容器中运行的进程。 'docker run -it -rm busybox/bin/sh -c top'来看看这个实际情况。 – BMitch

是看到有关主管商务部 https://docs.docker.com/engine/admin/using_supervisord/

您也可以使用守护进程的工具 http://cr.yp.to/daemontools.html

或S6 http://skarnet.org/software/s6/

+0

嗨,非常感谢您的信息。但我认为你的回答不太适合我的问题。可能是我确实清楚了我的问题。我已经重新编辑了我的问题。你能再次检查吗? –

+0

我从一个旧的Docker PR提取https://github.com/docker/docker/issues/3090这个'是的,在容器中运行的应用程序将进行扩展以使用CPU内核,就好像它们在容器外运行一样。 ' – user2915097

+0

您可能需要在您的'docker run'中指定您允许docker容器使用多少个Cpus,从doc中提取https://docs.docker.com/engine/reference/run/'--cpuset-cpus =“”\t允许执行的CPU(0-3,0,1)' – user2915097