как использовать многопроцессорность в Python правильно? - PullRequest
4 голосов
/ 16 октября 2019
import time
from multiprocessing import Process
start = time.perf_counter()


def sleep():
    print('Sleeping 1 second(s)...')
    time.sleep(1)
    return 'Done Sleeping...'

p1 = Process(target = sleep)
p2 = Process(target = sleep)
p1.start()
p2.start()
p1.join()
p2.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)')

вывод:

Finished in 0.17 second(s)

Я пытался использовать многопроцессорность, но когда я запускаю код, он заканчивается за 0,17 ~ секунды, а не 1, как должно быть, он не запускаетсяфункция вообще ...

Если я поставлю квадратные скобки так:

p1 = Process(target = sleep())
p2 = Process(target = sleep())

вывод:

Sleeping 1 second(s)...
Sleeping 1 second(s)...
Finished in 2.35 second(s)

windows 10. python 3.7.4 спасибо:)

1 Ответ

5 голосов
/ 16 октября 2019

Я решил проблему, чтобы ваш код работал, вы должны добавить, если __name__ == '__main__'. Оба ваших новых процесса должны получить доступ к вашему def sleep (), чтобы сделать это, вы должны либо отделить «исполняемую» часть вашего кода с помощью __name__ == "__main__", либо поместить def sleep () в другой файл и экспортировать его оттуда изИмпортировать имя файла sleep

import time
from multiprocessing import Process
start = time.perf_counter()


def sleep():
    print('Sleeping 1 second(s)...')
    time.sleep(1)
    return 'Done Sleeping...'


if __name__ == "__main__":
    p1 = Process(target = sleep)
    p2 = Process(target = sleep)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    finish = time.perf_counter()
    print(f'Finished in {round(finish-start, 2)} second(s)')

Надеюсь, что ответ вам пригодится.

Книга формы сайта "Стандартный Python 3 Libaray на примере" Дуга Хеллмана:

Одним из отличий между примерами многопроцессорной обработки и многопоточности является дополнительная защита __main__, включенная в примеры многопроцессорной обработки. В связи с тем, как запускаются новые процессы, дочерний процесс должен иметь возможность импортировать скрипт, содержащий целевую функцию. Обтекание основной части приложения проверкой на __main__ гарантирует, что оно не запускается рекурсивно для каждого дочернего элемента при импорте модуля. Другой подход - импортировать целевую функцию из отдельного скрипта. Например, multiprocessing_import_main.py использует рабочую функцию, определенную во втором модуле.

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