docker容器内的多个线程

p.m*_*aes 14 python multithreading docker

我需要在docker容器中生成N个线程.我将收到一个元素列表,然后将其分成块,每个线程将处理每个块.

所以我使用的是一个具有一个进程和N个线程的docker容器.这是码头工人的好习惯吗?我是这么认为的,因为我们有例如处理连接生成线程的apacha webserver.

或者最好为每个块生成每个块的N个容器?如果是,那么这样做的正确方法是什么?

Sac*_*tra 11

这样的容器与您需要执行的计算无关.您要发布的问题是我是否应该让多个进程执行我的处理,或者由进行处理的同一进程生成多个线程?

容器只是一个在您想要的环境中运行应用程序的平台.期.这意味着,您将在容器内运行流程来运行业务逻辑.多个容器只是意味着多个进程,并且建议您应该使用多个线程而不是多个进程,因为产生一个新进程(在您的情况下,作为容器)将占用更多资源并且还需要更多内存等.所以它最好只有一个容器,它会产生多个线程来为你完成这项工作.

但是,它还取决于启动容器的底层机器的配置.如果由于底层硬件的多核功能而产生多个线程的多个容器是有意义的,那么您也应该这样做.

  • 我不同意“容器只是一个在您想要的环境中运行应用程序的平台”。推荐这个 https://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/ `许多用户仍然像典型的虚拟机一样对待容器,却忘记了这一点容器有一个重要的特征:容器是一次性的。这始终取决于您的具体用例,但您可以完全利用临时容器来异步执行作业和并行性。这种架构提供了更大的灵活性和可扩展性。 (8认同)

Ang*_*los 7

简短答案:

将程序作为单个Docker容器运行。将Docker容器视为类似于虚拟环境的轻量级隔离环境,您可以在其中运行程序/服务。该服务可以运行全部从父程序启动的多个线程-它仍然是在单个Docker容器上运行的一项服务。

说明:

假设您有一个程序可以产生线程以完成某些工作-该程序可能是一个线程池,用于对一组块进行一些计算,也可能是像apache这样的Web服务器。甚至可能是一些python代码来实例化进程池来进行块计算。在所有这些情况下,所有线程和进程都属于一个主进程,可以将其视为单个程序或服务。该单个程序是通过单个用户命令触发的,该命令将在Dockerfile ENTRYPOINT中显示。

例如,您可以使用docker hub docker hub ref上的官方apache映像运行apache服务器容器:

docker run -dit --name my-apache-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
Run Code Online (Sandbox Code Playgroud)

这将使apache Web服务器作为单个容器运行,而不管它执行了多少线程,当操作员希望使用docker命令停止,重新启动,删除等操作时,可以轻松地引用它。而且这更加方便,因为我们无需担心附加安装体积,打开端口以及链接多个容器的麻烦,因此它们可以相互通信。

因此,主要要点是您希望为每个服务实例生成一个容器。例如,如果要启动父进程的重复实例。作为负载平衡配置的一部分,在两台计算机上运行apache,然后您将运行两个容器,每个主机上运行一个。

此外,此外,如果您有一个用例,需要在批处理系统中运行各种作业,而每个作业都需要安装特定的库,则这种用例类型将受益于环境隔离,而这种隔离将实现运行不同的容器。但这不是您要问的,您的问题专门提到了Web服务器生成线程和利用线程在块上工作的进程,对于这些情况,您生成了服务/程序的单个容器。