Форум сайта python.su
Здравствуйте,
Начну сразу с кусков кода (это лишь упрощенная симуляция настоящего кода, поэтому не пугайтесь )
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
Отредактировано Master_Sergius (Июнь 12, 2020 15:14:08)
Офлайн
> Соответственно, поведение другое. Почему? Проблема в разном создании процессов или сериализации?
Скорее всего это побочный эффект системного вызова fork.
> Как сделать так, чтобы поведение было одинаковым?
Не использовать функцию id
Офлайн
RodegastТак дело ж не в id, это вставил для демонстрации/объяснения что и как. А это ведет к проблемам, к примеру с тем значением глобальным (это тоже упрощение, в реальном коде нечто другое)
Как сделать так, чтобы поведение было одинаковым?Не использовать функцию id
Офлайн
> А это ведет к проблемам, к примеру с тем значением глобальным
Не волнуйся, проблем не будет.
Офлайн
Rodegast
Не волнуйся, проблем не будет.
global _test_value print("Global value:", _test_value)
Отредактировано Master_Sergius (Июнь 12, 2020 18:16:04)
Офлайн
> Ведь получается так, что после десериализации та глобальная переменная на винде…
Я надеюсь что ты не изменяешь глобальные переменные в реальных проектах
Офлайн
Я таки нашел подверждение своим догадкам - https://stackoverflow.com/questions/49782749/processpoolexecutor-logging-fails-to-log-inside-function-on-windows-but-not-on-u/49791106
Дело таки в процессах, вопрос можно считать закрытым
Офлайн