【发布时间】:2018-06-07 22:27:20
【问题描述】:
我正在尝试在 docker 容器内测试 python 的多处理,但即使成功创建了进程(我有 8 个 CPU 并创建了 8 个进程),它们也总是只占用一个物理 CPU。 这是我的代码:
from sklearn.externals.joblib.parallel import Parallel, delayed
import multiprocessing
import pandas
import numpy
from scipy.stats import linregress
import random
import logging
def applyParallel(dfGrouped, func):
retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
return pandas.concat(retLst)
def compute_regression(df):
result = {}
(slope,intercept,rvalue,pvalue,stderr) = linregress(df.date,df.value)
result["slope"] = [slope]
result["intercept"] = [intercept]
return pandas.DataFrame(result)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logging.info("start")
random_list = []
for i in range(1,10000):
for j in range(1,100):
random_list.append({"id":i,"date":j,"value":random.random()})
df = pandas.DataFrame(random_list)
df = applyParallel(df.groupby('id'), compute_regression)
logging.info("end")
当我像 --cpus 或 --cpuset 这样启动时,我尝试了多个 docker 选项,但它始终只使用 1 个物理 CPU。 这是 Docker、python、操作系统中的问题吗? Docker 版本是 1.13.1
cpu_count() 的结果:
>>> import multiprocessing
>>> multiprocessing.cpu_count()
8
【问题讨论】:
-
如果您在 Mac 或 Windows 上运行 Docker,它会在虚拟机内部运行。您需要将 Docker 作为一个整体进行配置,以便为该 VM 分配更多 CPU。
docker run的选项不会覆盖它,你不能只使用 VM 允许使用的数量。 -
它实际上在 Linux 中运行 :(
-
你能做一个
print(multiprocessing.cpu_count())并将结果添加到你的问题中吗? -
@hansaplast 我添加了截图
-
是来自 docker 内部的吗?
标签: python docker python-multiprocessing