2017-12-02 10 views
2

異なる分類子を訓練する複数の関数があり、各関数はいくつかの関連する出力パラメータを返します。それぞれの実行時間は少し長いので、私はmultiprocessingを利用したいと思っています。例えばPythonで異なる戻り値を持つ複数の関数を実行する方法

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

私はその誤植を考える:私はtargettrainingを変更し、p1実行p2が開始されます。各関数からどのように値を返すのですか?

おかげで、マルチプロセッシングモジュールの Gopi

+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.mapまたはmp.Pool.applyを使用することをお勧めします。私自身の目的のために、私はmp.Pool.apply_asyncが最も速く、最も便利な方法であることを発見した。multiprocessingモジュール。

+0

この実行中に、私はエラーを取得する: ' トレースバック(最新の呼び出しの最後): ファイル p2queue.put(training_data、training_labels)で、 "を" 1行目を ファイル(ブロック、タイムアウト): TypeError:長さのみです。 "C:¥Users¥dana0941¥AppData¥Local¥Continuum¥Anaconda3¥lib¥mult​​iprocessing¥queues.py"、行82、put self._sem.acquire -1配列をPythonスカラーに変換することができます.' – Gopi

+0

最初の関数呼び出しでも同じエラーが発生しました。私が提案したように関数を調整し、 'p1queue.put(output_variables)'に 'output_variables'を入れました。 – Gopi

関連する問題