Результаты постобработки после мультиобработки в Python - PullRequest
0 голосов
/ 07 ноября 2018

Итак, у меня есть простой код MP, и он работает как шарм. Однако, когда я выполняю очень простую постобработку данных, сгенерированных с помощью MP, код больше не работает. Он никогда не останавливается и не работает как всегда! Это код (и снова он отлично работает):

import numpy as np
from multiprocessing import Pool

n = 4
nMCS = 10**5

def my_function(j):
    result = []
    for j in range(nMCS // n):
        a = np.random.rand(10,2)
        result.append(a) 
    return result

if __name__ == '__main__':
    __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)" # this is because I am using Spyder!

    pool = Pool(processes = n) 

    data = pool.map(my_function, [i for i in range(n)])

    pool.close()
    pool.join()

#final_result = np.concatenate(data)   ### this is what ruins my code! ###

Между тем, если я добавлю final_result = np.concatenate(data) в конце, это никогда не сработает! Я использую Spyder , и если я просто наберу final_result = np.concatenate(data) в консоли ПОСЛЕ завершения MP, это даст мне то, что я хочу, то есть объединенный список. Однако, если я добавлю эту простую строку в основную программу в самом конце, она просто не будет работать. Может кто-нибудь сказать мне, как это исправить?

P.S. это очень простой пример, который я создал, чтобы вы могли понять, что происходит; Моя настоящая проблема намного сложнее, и я никак не могу выполнить постобработку после завершения работы с MP.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Как уже подразумевал @Ares, вы решаете проблему, вставляя все юг от if __name__ == "__main__" -статации в блок if.

Кстати, это происходит в Windows, которая не предусматривает разветвления для запуска новых процессов, таких как системы Unix-y, но использует «spawn» как метод запуска по умолчанию (и только). Spawn означает, что ОС должна загружать новый процесс с интерпретатором с нуля для каждого рабочего процесса.

Ваши рабочие процессы должны будут импортировать вашу целевую функцию my_function. Когда это происходит, все, что не защищено в if __name__ == "__main__": -блоке, также будет запускаться в каждом дочернем процессе при импорте.

0 голосов
/ 07 ноября 2018

Ваша проблема в том, что при запуске np.concatenate это не выполняется в функции main . Я подозреваю, что проблема, с которой вы сталкиваетесь, специфична для Spyder, но обновление отступа должно исправить ее.

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