Python многопроцессорность: процессы не работают параллельно - PullRequest
0 голосов
/ 28 апреля 2020

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

import multiprocessing, time

def print_squares(number):
    for i in range(number):
        print("square of {0} is {1}".format(i , i*i))
        time.sleep(0.1)

def print_cubes(number):
    for j in range(number):
        print("cube of {0} is {1}".format(j, j*j*j))
        time.sleep(0.1)

if __name__ == "__main__":
    process_1 = multiprocessing.Process(target = print_squares, args = (10,))
    process_2 = multiprocessing.Process(target = print_cubes, args = (10,))

    process_1.start()
    process_2.start()

    process_1.join()
    process_2.join()

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

square of 0 is 0

cube of 0 is 0

square of 1 is 1

cube of 1 is 1

и так далее. Вместо того, чтобы вести себя как описано, мой скрипт печатает:

cube of 0 is 0
cube of 1 is 1
cube of 2 is 8
cube of 3 is 27
cube of 4 is 64
cube of 5 is 125
cube of 6 is 216
cube of 7 is 343
cube of 8 is 512
cube of 9 is 729
square of 0 is 0
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36
square of 7 is 49
square of 8 is 64
square of 9 is 81

Очевидно, что процессы не работают параллельно, а второй процесс запускается только после завершения первого.

Кроме того, когда я запускаю подобный код, но использую потоки вместо процессов, он работает так, как я хочу.

Я использую windows 10 и python 3.8. Буду благодарен за любую информацию, как решить эту проблему и заставить два процесса работать одновременно, заранее спасибо!

1 Ответ

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

Код правильный, он должен работать параллельно. Вот вывод на моем компьютере (linux mint + python3 .8):

square of 0 is 0
cube of 0 is 0
square of 1 is 1

Возможно, есть некоторая буферизация stdout, и вызовы печати происходят в нужное время, но потоки сбрасываются на конец, попробуйте:

print("cube of {0} is {1}".format(j, j * j * j), flush=True)

или

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