Как правильно использовать многопроцессорность в Python, используя несколько файлов? - PullRequest
3 голосов
/ 26 апреля 2020

У меня есть 4 файла -> main.py, process1.py, process2.py, process3.py. Я хочу запустить (в al oop) все процессы, используя многопроцессорность. Но когда я выполняю свой код, работает только 1 процесс.

Код main.py:

from multiprocessing import Process
import process1, process2, process3

if __name__ == "__main__":
    p1 = Process(target=process1)
    p2 = Process(target=process2)
    p3 = Process(target=process3)
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()

Код process1.py:

while True:
    print("I'm process 1") 

Другие процессы аналогичны процессу 1.

Вывод :

I'm process 1
I'm process 1
I'm process 1
I'm process 1
...

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Решение

Преобразовать process1.py, process2.py и process3.py в функции

main.py должно быть:

from multiprocessing import Process

from process1 import process1
from process2 import process2
from process3 import process3

if __name__ == "__main__":
    p1 = Process(target=process1)
    p2 = Process(target=process2)
    p3 = Process(target=process3)
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()

и process1.py должны быть:

def process1():
    while True:
        print("I'm process 1")

, а остальные (process2 и process3) тоже должны быть превращены в функции

Пояснение

Теперь я понял, что происходит

, когда вы импортируете файл .py, python выполняет его, поэтому, когда вы впервые

import process1, process2, process3

python начинает выполнение первого процесса, поэтому ваш вывод не поступает из строки 7 в

p1.start()

, а из строки 2 при импорте, поэтому превращение их в функции приводит к тому, что де-импорт просто определяет process1 вместо его выполнения

0 голосов
/ 26 апреля 2020

Я не уверен, но я думаю, что то, что вы хотите сделать, может быть сделано с помощью модуля threading , но для этого вам нужно будет превратить процесс в функции следующим образом ( process1.py , например):

def process1():
    while True:
        print("I'm process 1")

и в основном коде вы можете использовать модуль потоков, создающий поток для каждого процесса:

from threading import Thread

from process1 import process1
from process2 import process2
from process3 import process3

if __name__ == "main":
    p1 = Thread(target=process1)
    p2 = Thread(target=process2)
    p3 = Thread(target=process3)

    p1.start()
    p2.start()
    p3.start()

, если у вас есть какой-либо процесс, который нужны аргументы, которые вы можете отправить по:

p1 = Thread(target=process1, args=(argument1, ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...