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

时间:2016-07-22 06:01:20

标签: multithreading docker multiprocessing

我有一些使用多进程的代码,如下所示:

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容器只是一个进程。所以我想知道如何在Docker中处理我的多进程?

以下是我的担忧:

  1. 由于容器只是一个过程,我的多进程代码会在此过程中变成多线程吗?

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

2 个答案:

答案 0 :(得分:5)

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

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

请注意几点:

  • 一旦pid 1退出,无论您的分叉进程是否仍在运行,您的容器都会结束。
  • 在没有init的情况下,未被父级获取的已退出进程将保留为僵尸(它们不会通过命名空间隔离来到达主机init进程)。如果这是一个问题(tini github repo),您可以运行tini应用程序作为清理这些应用程序的入口点。

答案 1 :(得分:0)

是的,请参阅有关主管的文档 https://docs.docker.com/engine/admin/using_supervisord/

您还可以使用守护程序工具 http://cr.yp.to/daemontools.html

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