如何在python中运行具有不同返回值的多个函数

时间:2017-12-02 13:07:08

标签: python multiprocessing

我有多个函数来训练不同的分类器,每个函数返回一些相关的输出参数。每个的执行时间稍长,所以我想利用multiprocessing

例如:

test_mthd = 'complete'
row_num = 288
prob_scores_ANN = test_ANN(test_dataset,test_labels, test_mthd, row_num, 
                       input_hidden_weights, hidden_output_weights, 
                       input_hidden_bias, hidden_output_bias)
predictions_KNN= eval_KNN(trainingSet,testSet, test_mthd, row_num)

现在,

from multiprocessing import Process
if __name__=='__main__':
    p1 = Process(target=building_tree_CART(trainingSet, depth_cond=8, min_cond=1))
    p1.start()
    p2 = Process(target= train_ANN(training_data,training_labels))  
    p2.start()
    p1.join()
    p2.join()

对此的启发来自:LINK

我认为这是一个拼写错误:我将training更改为target,然后p1运行,然后p2启动。以及我们如何从每个函数返回值?

谢谢, 戈皮

1 个答案:

答案 0 :(得分:0)

检查多处理模块的文档。 link

要在使用mp.process时检索值,您必须使用mp.queue。我发现这种多处理方式有点过于详细,你可以改为探索mp.Pool

但是,对于您的示例:

from multiprocessing import Queue, Process


def building_tree_CART(p1queue)
    trainingSet, depth_cond, min_cond = p1queue.get()
    #do stuff
    p1queue.put(variable)

def train_ANN(p2queue)
    training_data,training_labels = p2queue.get()
    #...
    p2queue.put(result)

if __name__=='__main__':
    #create separate instances of queues for processes
    p1queue = Queue()
    p1queue.put(trainingSet, 8, 1)
    p2queue = Queue()
    p2queue.put(training_data, training_labels)
    #Process targets a function, arguments are passed separately
    p1 = Process(target=building_tree_CART, args=p1queue)
    p1.start()
    p2 = Process(target=train_ANN, args=p2queue)  
    p2.start()
    p1.join()
    returned_variable = p1queue.get()
    p2.join()
    returned_variable2 = p2queue.get()

根据您提供的有限信息,这是最佳猜测。如果您需要多次运行函数,建议您使用mp.Pool.mapmp.Pool.apply。出于我自己的目的,我发现mp.Pool.apply_async是使用multiprocessing模块的最快捷,最便捷的方式。