1

我在 30 个 CPU 上并行化代码,并确认在容器外部使用 python 库“pathos”可以正常工作。

pool = ProcessPool(nodes=30)
results = pool.map(func_that_needs_to_run_in_parallel, range(30))
pool.close()
pool.join()

results_df = pd.concat(results)

但是,在 Docker 容器中将代码作为 Flask 应用程序的一部分运行时,它不起作用。我有三个容器:

  • 烧瓶应用程序,
  • 我用来将所有繁重的处理卸载到工作进程的redis,
  • 工作进程。

worker进程的代码可以总结为:

#some code that needs to be run on only one cpu
#the above 'ProcessPool' code snippet for one particularly resource-intensive task
#some code that needs to be run on only one cpu

当我运行应用程序时,工作容器中代码的并行化部分使用的 CPU 永远不会超过 4 个。我在 docker stats 和htop. docker-compose yaml 文件中的容器没有 cpu 使用限制。

htop显示代码在任何时候仅在 4 个 cpu 上运行,但实际上它在任务期间随机切换使用哪个 cpu,因此工作容器可以访问所有 48 个 cpu。

摘要:使用此多处理代码运行应用程序很有帮助,但 CPU 使用率存在上限。

4

1 回答 1

0

早期的 docker 文献(2016 年)建议每个 CPU 一个容器,但显然不是这样。这个想法是在运行时配置它,就像分配内存一样,

docker run -it --cpus="30" debian /bin/bash

我发现有用的 docker 容器资源分配,here


如果是问题,为什么不通过、或方法pathos切换到multiprocessor.Pool()库 ?applymap_asyncimap

于 2022-02-10T15:22:03.177 回答