RuntimeError: freeze_support () на Mac - PullRequest
0 голосов
/ 15 марта 2020

Я новичок в python. Я хочу научиться параллельной обработке в python. Я увидел следующий пример:


import multiprocessing as mp

np.random.RandomState(100)
arr = np.random.randint(0, 10, size=[20, 5])
data = arr.tolist()

def howmany_within_range_rowonly(row, minimum=4, maximum=8):
    count = 0
    for n in row:
    if minimum <= n <= maximum:
        count = count + 1
    return count

pool = mp.Pool(mp.cpu_count())

results = pool.map(howmany_within_range_rowonly, [row for row in data])

pool.close()

print(results[:10])

, но когда я его запустил, произошла эта ошибка:

RuntimeError: 
    An attempt has been made to start a new process before the
    current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.

Что мне делать?

1 Ответ

0 голосов
/ 15 марта 2020

Если вы разместите все в глобальной области видимости внутри этого блока if __name__ == "__main__" следующим образом, вы должны обнаружить, что ваша программа ведет себя так, как вы ожидаете:

def howmany_within_range_rowonly(row, minimum=4, maximum=8):
    count = 0
    for n in row:
    if minimum <= n <= maximum:
        count = count + 1
    return count

if __name__ == "__main__":   
    np.random.RandomState(100)
    arr = np.random.randint(0, 10, size=[20, 5])
    data = arr.tolist()  
    pool = mp.Pool(mp.cpu_count())

    results = pool.map(howmany_within_range_rowonly, [row for row in data])

    pool.close()

    print(results[:10])

Без этой защиты, если ваш текущий модуль был импортирован из другой модуль, ваш многопроцессорный код будет выполнен. Это может происходить в неосновном процессе, порожденном в другом пуле, и порождение процессов из подпроцессов не допускается, поэтому мы защищаем от этой проблемы.

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