Python 多处理似乎不使用多个内核

标签 python multiprocessing

我想使用 Python 多处理来运行网格搜索以查找预测模型。 当我查看核心使用情况时,它似乎总是只使用一个核心。知道我做错了什么吗?

import multiprocessing
from sklearn import svm
import itertools

#first read some data
#X will be my feature Numpy 2D array
#y will be my 1D Numpy array of labels

#define the grid        
C = [0.1, 1]
gamma = [0.0]
params = [C, gamma]
grid = list(itertools.product(*params))
GRID_hx = []

def worker(par, grid_list):
    #define a sklearn model
    clf = svm.SVC(C=g[0], gamma=g[1],probability=True,random_state=SEED)
    #run a cross validation function: returns error
    ll = my_cross_validation_function(X, y, model=clf, n=1, test_size=0.2)
    print(par, ll)
    grid_list.append((par, ll))


if __name__ == '__main__':
   manager = multiprocessing.Manager()
   GRID_hx = manager.list()
   jobs = []
   for g in grid:
      p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
      jobs.append(p)
      p.start()
      p.join()

   print("\n-------------------")
   print("SORTED LIST")
   print("-------------------")
   L = sorted(GRID_hx, key=itemgetter(1))
   for l in L[:5]:
      print l

最佳答案

您的问题是您加入每项工作在您开始后立即:

for g in grid:
    p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
    jobs.append(p)
    p.start()
    p.join()

join 阻塞,直到相应的进程完成工作。这意味着您的代码一次只启动一个进程,等待它完成,然后再启动下一个进程

为了让所有进程并行运行,您需要首先将它们全部启动,然后将它们全部加入:

jobs = []
for g in grid:
    p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
    jobs.append(p)
    p.start()

for j in jobs:
    j.join()

文档:link

关于Python 多处理似乎不使用多个内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29802503/

相关文章:

python - 为什么 dict 没有在 python 多处理中更新?

python - 无法腌制 redis-py 实例 (_thread.lock)

Python 3 Multiprocessing Pool 对于大变量来说很慢

python - 使用多处理读取多个文件

python - 有没有办法打破带有类别的 pandas 列,以将类别名称作为列名称来分隔 true 或 false 列

python - TensorFlow 中 LSTM 分类序列的 OneHotEncoding

python - 在多处理期间保持统一计数?

Python:如何从列表中删除价低于特定值的值

python - 如何将本地模块导入azure databricks笔记本?

验证后枚举值为 'Not a valid choice' 的 Python Flask WTForm SelectField