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

Kra*_* Li 12 multithreading multiprocessing 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()
Run Code Online (Sandbox Code Playgroud)

该程序正在对非常大的数据集进行大量计算.因此,我们需要多进程来同时处理工作以提高性能.

我被告知,对于托管系统,一个docker容器只是一个进程.所以我想知道如何在Docker中处理我的多进程?

以下是我的担忧:

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

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

BMi*_*tch 5

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

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

请注意以下几点:

  • pid 1退出后,无论分叉进程是否仍在运行,容器都将结束。
  • 如果没有init,则未由其父级获得的退出进程将保持为僵尸状态(它们不会通过名称空间隔离来到达主机init进程)。如果有问题,tini您可以运行一个应用程序作为入口点来清理它们(tini github repo)。

  • @yeehaw 分叉进程与其父进程保持相同的 cgroup,因此在容器中,进程彼此具有相同的 cgroup,并在同一 pid 命名空间中查看其他进程。一旦命名空间的 cgroup pid 1 终止,容器将被视为停止,并且该 cgroup 中的所有进程都将被终止/回收。 (2认同)