Изучая способы распараллелить код в Python столкнулся с разным поведением Shared memory модуля multiprocessing на Linux и Windows.
Вот код, демонстрирующий такое неопределенное поведение:
from time import sleep
from multiprocessing import Process, Value
c = Value('d', 5)
def simpleTimer():
global c
while c.value > 0:
sleep(1)
c.value -= 1
print('Value in second process:', c.value)
if __name__ == '__main__':
p = Process(target=simpleTimer)
p.start()
while c.value > 0:
sleep(1)
print('Value in main process:', c.value)
Я специально собрал Python 3.8.2 из тарболла, чтобы не пенять на патчи дистрибутива. Вот соответствующий моим ожиданиям результат на Ubuntu 19.10:
$ ./python test_mp.py
Value in main process: 5.0
Value in second process: 4.0
Value in main process: 4.0
Value in second process: 3.0
Value in main process: 3.0
Value in second process: 2.0
Value in main process: 2.0
Value in second process: 1.0
Value in main process: 1.0
Value in second process: 0.0
Value in main process: 0.0
$
А вот поведение той же версии Python под Windows 10 LTSC:
>python D:\test_mp.py
Value in main process: 5.0
Value in second process: 4.0
Value in main process: 5.0
Value in second process: 3.0
Value in main process: 5.0
Value in second process: 2.0
Value in main process: 5.0
Value in second process: 1.0
Value in main process: 5.0
Value in second process: 0.0
Value in main process: 5.0
Value in main process: 5.0
Traceback (most recent call last):
File "D:\test_mp.py", line 18, in <module>
sleep(1)
KeyboardInterrupt
^C
>
Скрипт сам не завершается.
Из документации CPython:
the multiprocessing module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows.
Я не знаю, кто виноват в этих бедах с синхронизацией процессов, мне почему-то кажется, что этот баг уже бы давно отловили будь он таковым. Покажите пожалуйста на мои ошибки и объясните почему так происходит, а если моей вины тут нет, то я отправлюсь на багтрекер CPython.