私は、関数から結果を収集するために使用するリストがプロセスによって更新されないマルチプロセッシングの状況があります。私はコードの2つの例を持っています。リストを更新するものがあります。修正:コードは 'Thread'を使って正しく更新されますが、 'Process'を使用すると失敗します。とそうではありません。私はどんな種類のエラーも検出できません。私はこれが私が理解していない範囲の微妙なものかもしれないと思う。ここでマルチプロセッシングスコープ: 'マルチプロセッシングプロセス'を使用して更新しません。 'threading.Thread'を使用して処理しました
は実施例である:訂正:この例では、いずれかの動作しません。しかし、threading.Thread
で動作します。ここで
def run_knn_result_wrapper(dataset,k_value,metric,results_list,index):
results_list[index] = knn_result(dataset,k_value,metric)
results = [None] * (k_upper-k_lower)
threads = [None] * (k_upper-k_lower)
joined = [0] * (k_upper-k_lower)
for i in range(len(threads)):
threads[i] = Process(target=run_knn_result_wrapper,args=(dataset,k_lower+i,metric,results,i))
threads[i].start()
if batch_size == 1:
threads[i].join()
joined[i]=1
else:
if i % batch_size == batch_size-1 and i > 0:
for j in range(max(0,i - 2),i):
if joined[j] == 0:
threads[j].join()
joined[j] = 1
for i in range(len(threads)):
if joined[i] == 0:
threads[i].join()
Ignoring the "threads" variable name (this started on threading, but then I found out about the GIL), the `results` list updates perfectly.
結果リストが更新されないコードです:
def prediction_on_batch_wrapper(batchX,results_list,index):
results_list[index] = prediction_on_batch(batchX)
batches_of_X = np.array_split(X,10)
overall_predicted_classes_list = []
for i in range(len(batches_of_X)):
batches_of_X_subsets = np.array_split(batches_of_X[i],10)
processes = [None]*len(batches_of_X_subsets)
results_list = [None]*len(batches_of_X_subsets)
for j in range(len(batches_of_X_subsets)):
processes[j] = Process(target=prediction_on_batch_wrapper,args=(batches_of_X_subsets[j],results_list,j))
for j in processes:
j.start()
for j in processes:
j.join()
if len(results_list) > 1:
results_array = np.concatenate(tuple(results_list))
else:
results_array = results_list[0]
Pythonのスコープはresults_list
リストはprediction_on_batch_wrapper
機能によって更新されません規則の範囲内私は、なぜ言うことができません。
デバッグセッションがprediction_on_batch_wrapper
関数の中results_list
値は、実際には、更新さないことを明らかに...何とか、それはスコープのこの第二のpythonファイルにローカルであり、第1のグローバル...
ここでは何が起こっていますか?
スレッドとプロセスの違い、およびあなたが言及した質問の答えに '' manager = Manager() ''と '' return_dict = manager.dict() ''を使用する理由を理解していますか? :http://stackoverflow.com/questions/10415028/how-can-i-recover-the-return-value-of-a-function-passed-to-multiprocessing-proce – minhhn2910
いいえ、まったくありません:)しかし、私は今私がすると思います。 – bordeo
'' manager = Manager() ''と '' results_list = managerを試してください。まだプロセスを使用したい場合は、リスト([None] * len(batches_of_X_subsets)) ''を2番目のスニペットに追加してください:D – minhhn2910