У меня короткий фрагмент звонка pool.map
, чтобы положить трубку. Он не возвращается в разумные сроки. Идея состоит в том, чтобы иметь пару списков точек и найти меру для соответствия другому списку точек.
import numpy as np
import multiprocessing
import scipy.spatial as ss
def dist(args): # returns the sum of distances of the nearest neighbors.
kdSet, points = args
dist, _ = kdSet.query(points)
return np.sum(dist)
#just define some points to play with
points = np.array([[13.27, 25.49], [13.18, 25.39], [13.08, 25.39],
[12.99, 25.39], [12.89, 25.39], [12.80, 25.39],
[12.71, 25.39], [12.61, 25.30], [12.52, 25.30]])
pointList = [points + idx for idx in range(3)] #creates a list of points
#create a list of KDTrees for fast lookup. Add some number to make them a little different from pointList
kdTreeList = [ss.KDTree(pointsLocal + idx/10) for idx, pointsLocal in enumerate(pointList)]
#this part works fine: serial execution
distances = list(map(dist, zip(kdTreeList, pointList)))
print(distances)
#this part hangs, if called as multiprocess, expected the same result as above
with multiprocessing.Pool() as pool:
print('Calling pool.map')
distancesMultiprocess = pool.map(dist, zip(kdTreeList, pointList)) #<-This call does not return, but uses the CPU 100%
print(distancesMultiprocess)
Последовательный вызов функции работает нормально. Но если вызывается в функции pool.map, она не выдает ошибку и не возвращает ничего. Это просто висит там. Загрузка процессора достигает 100%, поэтому что-то происходит.
Удаление класса KDTree для целей тестирования не показало другого результата.
Поскольку не выдается ошибка, я понятия не имею, что здесь происходит не так. Любой намек?