Вопрос по python-2.7, multiprocessing, python – Python многопроцессорный пул, присоединиться; не ждет, чтобы продолжить?

16

(1) яя пытаюсь использоватьpool.map с последующимpool.join(), но питон не делаеткажется, ждуpool.map закончить, прежде чем пройти мимоpool.join(), Вот'простой пример того, что ямы пробовали:

from multiprocessing import Pool

foo = {1: []}

def f(x):
    foo[1].append(x)
    print foo

def main():
    pool = Pool()
    pool.map(f, range(100))
    pool.close()
    pool.join()
    print foo

if __name__ == '__main__':
    main()

Распечатка просто{1: []}, как будто питон просто проигнорировалjoin командовать и побежалprint foo прежде чем он имел возможность бежатьf, Ожидаемый результат заключается в том, чтоfoo является{1:[0,1,...,99]}и используя обычный встроенный питонmap дает этот результат. Почему печатается пул версия{1: []}и как я могу изменить свой код, чтобы он печатал намеченный результат?

(2) В идеале ятакже хотел бы определитьfoo в качестве локальной переменной вmain() и передать егоf, но делает это, делаяfoo первый аргументf и используя

pool.map(functools.partial(f, foo), range(100))

производит тот же результат. (и, возможно, также имеет проблему, что каждый процесс теперь имеет свою собственную копиюfoo?) Хотя, опять же, он работает с использованием обычногоmap вместо.

Ваш Ответ

1   ответ
23

map

Использование глобальной переменной таким способом абсолютно неверно. Процессы не разделяют одну и ту же память (обычно), поэтому каждыйf будет иметь свою собственную копиюfoo, Чтобы разделить переменную между различными процессами, вы должны использоватьManagerФункция переданаmap обычно ожидается возвращение значения.

Я предлагаю вам прочитать некоторыедокументация.

Однако вот пример того, как вы могли бы это реализовать:

from multiprocessing import Pool

foo = {1: []}

def f(x):
    return x

def main():
    pool = Pool()
    foo[1] = pool.map(f, range(100))
    pool.close()
    pool.join()
    print foo

if __name__ == '__main__':
    main()

Вы также можете сделать что-то вродеpool.map(functools.partial(f, foo), range(100)) гдеfoo это .Manager

Python ждет этого, ноfoo родительского процесса нет изменить. Каждый дочерний процесс в пуле изменяет свою собственную копиюfooа не тот, который печатается в конце основного. smeso
Но почему в оригинальной программе python неждать завершения pool.map, прежде чем идти мимо pool.join ()? zell
Зачем тебеpool.join() если вы используетеpool.map() функция, которая блокирует?docs.python.org/2/library/... Jack Stevens
призваниеpool.close() а такжеpool.join() будет гарантировать, что не толькоmap был завершен (как вы заметили, это блокирует), но также и то, что процессы в пуле были завершены и их ресурсы освобождены. Не то, что вам абсолютно необходимо сделать, но все равно приятно, если вы неони мне больше не нужны. smeso

Похожие вопросы