multiprocessing.Process многократно вызывает основную функцию от строки создания процесса до конца строки? - PullRequest
0 голосов
/ 01 августа 2020

У меня два файла. Один - создать и вернуть процесс. Другой - асинхронное создание множества нескольких процессов.

Проблема, с которой я столкнулся, заключается в том, почему строка print("all process created") (строка 13) во втором файле выполнялась 3 раза?

process1.py

import time
import multiprocessing 

def wait(s):
    print(f"Waiting for {s} seconds...")
    time.sleep(s)
    print(f"Done Waiting for {s} seconds...")

def create_process(sec):
    p1 = multiprocessing.Process(target=wait, args=(sec, ))
    p1.start()
    return p1

main_file.py

from process1 import create_process
import time

procs = []

def many_process():
    global procs
    if __name__ == "__main__":
        for i in range(1,4):
            print(f"creating process to sleep {i}")
            p = create_process(i)
            procs += [p]

    print("all process created")

many_process()
for p in procs:
    p.join()

вывод:

creating process to sleep 1
creating process to sleep 2
creating process to sleep 3
all process created
all process created
Waiting for 1 seconds...
all process created
Waiting for 3 seconds...
all process created
Waiting for 2 seconds...
Done Waiting for 1 seconds...
Done Waiting for 2 seconds...
Done Waiting for 3 seconds...

1 Ответ

0 голосов
/ 02 августа 2020

Многопроцессорность может разветвлять или порождать процессы. Поскольку Windows не поддерживает вилку, его единственный вариант - спавн. При порождении создается новый экземпляр python, который должен быть инициализирован как для загрузки рабочего кода, так и для создания среды для его выполнения. Это включает в себя импорт модулей, в том числе сценарий, который все это запустил.

Чтобы это было успешным, модули должны быть безопасными для импорта. То есть простой импорт не запускает больше кода, чем вы хотите. В вашем случае дополнительный код был достаточно безобидным. Поскольку вы использовали if, чтобы many_process не создавал процессы при импорте, все, что произошло, это то, что печать, которая также должна была быть в if, выдавала неверную информацию.

Но на самом деле if должен быть выше по коду. Функцию процесса создания вообще не следовало запускать.

main_file.py

from process1 import create_process
import time

def many_process():
    global procs
    for i in range(1,4):
        print(f"creating process to sleep {i}")
        p = create_process(i)
        procs += [p]
    print("all process created")

if __name__=="__main__":
    # emulating windows on other platforms for test, remove in real code
    import multiprocessing
    multiprocessing.set_start_method("spawn")

    procs = []
    many_process()
    for p in procs:
        p.join()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...