我需要在docker容器中生成N个线程。我将收到一个元素列表,然后将其分成块,每个线程将处理每个块。
所以我使用的是一个包含一个进程和N个线程的docker容器。这是码头工人的好习惯吗?我是这么认为的,因为我们有一个apacha webserver来处理连接产生线程。
或者最好为每个块生成每个块的N个容器?如果是,那么这样做的正确方法是什么?
答案 0 :(得分:8)
这样的容器与您需要执行的计算无关。您发布的问题是是否应该让多个进程执行我的处理,或者由进行处理的同一进程生成多个线程?
容器只是您所需环境中运行应用程序的平台。期。这意味着,您将在容器内运行流程来运行业务逻辑。多个容器只是意味着多个进程,并且建议,您应该使用多个线程而不是多个进程,因为产生一个新进程(在您的情况下,作为容器)会占用更多资源并且还会需要更多的内存等。所以最好只有一个容器,它会产生多个线程来为你完成这项工作。
但是,还取决于启动容器的底层计算机的配置。如果由于底层硬件的多核功能而产生多个线程的多个容器是有意义的,那么您也应该这样做。
答案 1 :(得分:5)
简答:
将程序作为单个docker容器运行。将docker容器视为轻量级隔离环境,类似于虚拟环境,您可以在其中运行程序/服务。这个服务可以运行所有从父程序启动的多个线程 - 它仍然是在一个docker容器上运行的一个服务。
<强>解释强>
让我们假设您有一个程序产生线程,以便进行一些工作 - 这个程序可能是一个线程池,可以对一组块进行一些计算,也可以像apache这样的Web服务器。它甚至可能是一些实例化进程池的python代码执行chunch计算。在所有这些情况下,所有线程和进程都属于主进程,可以将其视为单个程序或服务。此单个程序通过单个用户命令触发,该命令将在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
这将将apache Web服务器作为单个容器运行,而不管它执行多少线程,当操作员希望使用docker命令停止,重新启动,删除等时,可以轻松地引用它。这样更方便,因为我们不需要担心附加安装卷,打开端口和连接大量容器,因此它们相互通信。
所以主要的一点是你想为每个服务实例生成一个容器。例如,如果要启动父进程的重复实例。作为负载平衡配置的一部分在两台机器上运行apache,然后运行两个容器,每个主机一个。
另外,如果您有一个用例,您需要在批处理系统中运行不同的作业,其中每个作业都需要安装特定的库,那么这种类型的用例将受益于环境隔离通过运行不同的容器来实现。但这不是你问的问题,你的问题特别提到了一个Web服务器产生线程和利用线程来处理块的进程,对于那些情况,你为服务/程序产生了一个容器。