gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:46:38 32 4
gpt4 key购买 nike

我有一些像这样使用多进程的代码:

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. 性能会下降吗?因为我使用多进程的原因是为了同时完成工作以获得更好的性能。

最佳答案

我怀疑大部分混淆来自于将容器视为轻量级 VM。相反,可以将 Linux 容器视为一种通过命名空间和 cgroup 设置运行进程的方式。

其中一个命名空间是 pid 命名空间。配置它时,您会看到该命名空间中的第一个进程作为命名空间内的 pid 1。从另一个 pid 命名空间,您看不到那些其他命名空间或主机命名空间。在主机上,在任何命名空间之外,您将看到所有进程,包括在任何命名空间中的进程。

当你 fork 一个新进程时,你继承了相同的命名空间和 cgroup,因此你将在 pid 命名空间中获得一个新的 pid,允许你像任何其他 Linux 环境一样运行多个进程。在容器内部,您可以运行 ps 命令(假设它包含在您的镜像中)并查看多个进程正在运行:

$ docker run -it --rm busybox /bin/sh
/ # sleep 30s &
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 /bin/sh
7 root 0:00 sleep 30s
8 root 0:00 ps -ef

仅运行单个进程的建议并非来自多线程应用程序,而是来自将容器视为轻量级 VM 的人们。它们将产生多个彼此没有硬依赖的应用程序,例如 Web 服务器、数据库和邮件服务器。完成后,有几个关键问题:

  • 容器日志不可用。它们要么混杂着多个进程,所有进程都写入同一个 stdout/stderr。或者它们是空的,而将日志写入容器文件系统,而这些文件系统经常会丢失。
  • 错误处理存在问题。如果邮件服务器出现错误,是否应该关闭数据库并重新启动以尝试更正问题?如果不杀掉整个容器,怎么知道邮件服务器宕机了?

简而言之,管理容器的设计假设每个容器一个应用程序,如果你打破这个假设,当工具不支持你的用例时,你可以保留这两个部分。

注意几句:

  • 一旦 pid 1 退出,您的容器就会结束,无论您的 fork 进程是否仍在运行。这意味着所有进程都被杀死并被回收。
  • 通常在 Linux 上,当父进程在没有等待其子 pid 的情况下死亡时,僵尸进程最终会被以 pid 1 运行的 init 进程收割。此收割进程不会越过 pid 命名空间边界,因此如果您 fork 子进程,确保容器内的 pid 1 正在等待这些子进程清理它们。此任务的常见 pid 1 进程是 tini (init 向后拼写)。甚至还有一个标志可以让 docker 为你运行它(--init)。

关于multithreading - 我们可以在 docker 中运行多进程程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38519223/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com