我想使用Python多处理为预测模型运行网格搜索。 当我看看核心使用情况时,它似乎总是只使用一个核心。任何想法我做错了什么?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
修复该连接后,您可能还需要阅读全局解释器锁(GIL)。 Python不能同时在两个线程上执行python代码。但是,对于像numpy这样的python的C库,这些库可以在执行计算密集型任务时选择放弃GIL。如果您想要有效地使用多个内核,请确保您的大部分工作都在C库中的一个C库中完成,这些C库在工作时丢弃GIL。 –
注意:您可能希望使用['Pool'](https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool),而不是手动创建和连接每个进程。只要执行'pool.map(worker,args = zip(grid,[GRID_hx] * len(grid))])',这将自动启动不同的进程(并行)并加入它们。 – Bakuriu
@CortAmmon你写的东西是完全不相关的。他正在使用多**处理**而不是多线程*,因此GIL在该代码中不会显示任何*作用。另外:他使用'multiprocessing'而不是'threading'可能意味着他已经知道GIL。 – Bakuriu