我们可以在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中处理?
下面是我的关心:
由于容器只是一个过程,我会多进程代码成为多线程程序?
表现会下降吗?因为我使用多进程的原因是同时完成工作以获得更好的性能。
泊坞窗包括命名空间的进程ID和运行多个完整支持内核进程。在容器内部,您可以运行ps来查看隔离的进程列表(这通常只是您的shell和ps命令)。
运行单个应用程序的docker的描述是将应用程序隔离技术与更熟悉的OS虚拟化工具分开,在那里您将在后台启动Web服务器,邮件服务器,ssh守护程序等。
谨慎的几句话:
- 一旦PID 1退出,你的容器两端,不管你的派生进程是否仍在运行与否。
- 如果没有init,退出的父进程没有收到的进程将保持为僵尸(它们不会传递命名空间隔离来到达主机init进程)。如果这是一个问题(tini github repo),您可以运行一个
tini
应用程序作为入口点以清理这些应用程序。
是看到有关主管商务部 https://docs.docker.com/engine/admin/using_supervisord/
您也可以使用守护进程的工具 http://cr.yp.to/daemontools.html
嗨,非常感谢您的信息。但我认为你的回答不太适合我的问题。可能是我确实清楚了我的问题。我已经重新编辑了我的问题。你能再次检查吗? –
我从一个旧的Docker PR提取https://github.com/docker/docker/issues/3090这个'是的,在容器中运行的应用程序将进行扩展以使用CPU内核,就好像它们在容器外运行一样。 ' – user2915097
您可能需要在您的'docker run'中指定您允许docker容器使用多少个Cpus,从doc中提取https://docs.docker.com/engine/reference/run/'--cpuset-cpus =“”\t允许执行的CPU(0-3,0,1)' – user2915097
我试着理解你的话。所以你的意思是码头支持多处理。但是这些进程被进程命名空间隔离,所以我们无法在Docker容器外看到它们,对吧? –
进程隔离意味着容器内的进程无法看到主机,他们只会看到自己正在运行。但主机将能够看到容器中运行的进程。 'docker run -it -rm busybox/bin/sh -c top'来看看这个实际情况。 – BMitch