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

ADJ*_*ADJ 34 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
Run Code Online (Sandbox Code Playgroud)

hel*_*ert 49

您的问题是您在启动后立即加入每个作业:

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

连接块,直到相应的进程完成工作.这意味着您的代码一次只启动一个进程,等待它完成然后启动下一个进程.

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

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()
Run Code Online (Sandbox Code Playgroud)

文档:链接


Rob*_*bel 6

根据文档,join()命令锁定当前线程,直到指定的线程返回.因此,您基本上在for循环中启动每个线程,然后等待它完成,然后再继续下一次迭代.

我建议移动循环外的连接!


Cal*_*602 5

我会说 :

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

目前你正在产生一份工作,然后继续完成它,然后转到下一个工作.