私がしようとしているのは、どのマルチプロセッシングが自分のデータに最適かをチェックすることです。Pythonマルチプロセス/スレッディングループ。
def __pure_calc(args):
j = args[0]
point_array = args[1]
empty = args[2]
tree = args[3]
for i in j:
p = tree.query(i)
euc_dist = math.sqrt(np.sum((point_array[p[1]]-i)**2))
##add one row at a time to empty list
empty.append([i[0], i[1], i[2], euc_dist, point_array[p[1]][0], point_array[p[1]][1], point_array[p[1]][2]])
return empty
ただ、純粋な関数が6.52秒を取っている:私はこのループをマルチしてみました。
私の最初のアプローチは、multiprocessing.mapた:
from multiprocessing import Pool
def __multiprocess(las_point_array, point_array, empty, tree):
pool = Pool(os.cpu_count())
for j in las_point_array:
args=[j, point_array, empty, tree]
results = pool.map(__pure_calc, args)
#close the pool and wait for the work to finish
pool.close()
pool.join()
return results
私は他の答えをチェックするとどのようにそれは簡単なはず機能マルチすると:マップ(通話機能、入力) - 行わ。しかし何らかの理由で、私のマルチプルアクセスが自分の入力を除いているわけではないので、scipy.spatial.ckdtree.cKDTreeオブジェクトに添字付け不可能なエラーが発生しています。
だから私はapply_asyncで試してみました:
from multiprocessing.pool import ThreadPool
def __multiprocess(arSegment, wires_point_array, ptList, tree):
pool = ThreadPool(os.cpu_count())
args=[arSegment, point_array, empty, tree]
result = pool.apply_async(__pure_calc, [args])
results = result.get()
それが出て問題に実行します。私のテストデータでは、私はそれを計算することができます6.42秒。
なぜapply_asyncが問題を解決してckdtreeを受け入れ、pool.mapを受け入れないのですか?私はそれを実行させるために変更する必要がありますか?