Python многопроцессорная обработка выполняет весь код и выполняется в неправильном порядке - PullRequest
0 голосов
/ 22 марта 2020

У меня есть код, выполняющий два процесса. Есть три проблемы:

  1. Когда используется многопроцессорная обработка, выполняется весь код.
  2. time.sleep при запуске приостанавливает весь код, а не после print('hello', name, 'sleeping 1 second'), а после этого выполняется остальная часть без сделки, как и не должно.
  3. Процессы выполняются в обратном порядке.

Код:

import multiprocessing
import time

print('--Beginning of code--')

def f(name):
    print('hello', name, 'sleeping 1 second')
    time.sleep(1)
    print('goodbye', name)

if __name__ == '__main__':
    p = multiprocessing.Process(target=f, args=('Bob',))
    p2 = multiprocessing.Process(target=f, args=('Tom',))
    p.start()
    p2.start()
    p.join()
    p2.join()

print('--end of code--')

Вывод:

--Beginning of code--
--Beginning of code--
--end of code--
hello Tom sleeping 1 second
goodbye Tom
--Beginning of code--
--end of code--
hello Bob sleeping 1 second
goodbye Bob
--end of code--

Как должен выглядеть вывод:

--Beginning of code--
hello Bob sleeping 1 second
hello Tom sleeping 1 second
goodbye Bob
goodbye Tom
--end of code--

Я попытался выполнить поиск и не смог найти никакого решения. Сначала это не могло даже бежать, но мне удалось это работать. Я использую Python 3.8.1 (извините за мой плохой английский sh)

Ответы [ 2 ]

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

Это немного натянуто, но вы можете сделать это следующим образом:

import multiprocessing
import time

def f(name):
    print('hello', name, 'sleeping 1 second')
    time.sleep(1)
    print('goodbye', name)


if __name__ == '__main__':

    f.has_been_called = False
    print('--Beginning of code--')

    f.has_been_called = True
    if f.has_been_called:
        p = multiprocessing.Process(target=f, args=('Bob',))
        p2 = multiprocessing.Process(target=f, args=('Tom',))
        p.start()
        p2.start()
        p.join()
        p2.join()

    print('--end of code--')
0 голосов
/ 22 марта 2020

Это также зависит от платформы (Unix, Windows) и метод запуска .

Вы можете получить ожидаемые результаты на платформе Unix, используя метод fork (это метод по умолчанию, поэтому нет необходимости устанавливать его явно). Основной процесс будет fork дочерним процессом, а дочерний процесс будет запускать только целевую функцию (f в вашем случае):

$ python test.py
--Beginning of code--
hello Bob sleeping 1 second
hello Tom sleeping 1 second
goodbye Bob
goodbye Tom
--end of code--

Похоже, ваш скрипт использует spawn метод, скорее всего, на Windows, так как это единственный метод, доступный на этой платформе. В этом методе родительский процесс запускает процесс интерпретатора fre sh python (python -c from multiprocessing.spawn import spawn_main...), поэтому выполняется весь модуль:

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')
...

Test:

$ python test.py
--Beginning of code--
--Beginning of code--
--end of code--
hello Bob sleeping 1 second
--Beginning of code--
--end of code--
hello Tom sleeping 1 second
goodbye Bob
goodbye Tom
--end of code--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...