Многопроцессорная работа pool.map не возвращается из вызова функции - PullRequest
1 голос
/ 14 февраля 2020

У меня короткий фрагмент звонка 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 для целей тестирования не показало другого результата.

Поскольку не выдается ошибка, я понятия не имею, что здесь происходит не так. Любой намек?

1 Ответ

0 голосов
/ 14 февраля 2020

Большое спасибо juanpa.arrivillaga, добавившему

    if __name__ == "__main__":

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...