Начну сразу с кусков кода (это лишь упрощенная симуляция настоящего кода, поэтому не пугайтесь )
Python 3.7-8
# file process_pe.py from concurrent.futures import ALL_COMPLETED, ProcessPoolExecutor, wait from utils import calculate from manager import get_value def main(): print(get_value()) print(get_value) print('-' * 20) futures = set() with ProcessPoolExecutor(max_workers=2) as pool: for value in [2, 3]: futures.add(pool.submit(calculate, value)) done, futures = wait(futures, return_when=ALL_COMPLETED) for future in done: print(future.result()) if __name__ == '__main__': main()
# file utils.py import time from manager import get_value, _test_value def calculate(x): print('<---') get_value() print(get_value) print('test_value: ', _test_value) print(f'id of _test_value: {id(_test_value)}') print('--->') time.sleep(1) return x**x
# file manager.py _test_value = None def get_value(): global _test_value print("Global value:", _test_value) print('.' * 20) print(f'id of _test_value: {id(_test_value)}') if not _test_value: _test_value = 5 print('.' * 20) return _test_value
Запускаем первый файл (python process_pe.py). На никсах (linux, mac), функция get_value имеет одинаковый id в разных подпроцессах, на винде же get_value имеет разный айдишник. Соответственно, поведение другое. Почему? Проблема в разном создании процессов или сериализации? Как сделать так, чтобы поведение было одинаковым?