Загрузка модуля Python в дочерних процессах на windows - PullRequest
2 голосов
/ 07 ноября 2019

У меня сложилось впечатление, что, поскольку многопроцессорный модуль Python не может работать при порождении новых процессов в Windows, при запуске нового процесса будет импортирован исходный модуль (с которого запускается родительский процесс) с нуля. Это означает, например, что любой код, не защищенный предложением if __name__=='__main__', будет выполняться в дочернем процессе. При выполнении простого теста это не всегда так.

Учитывая следующий простой пакет и скрипт со следующей структурой файла:

test.py
test_package
    │-- __init__.py
    \-- __main__.py

и следующее содержимое:

# ------------------------------
# __init__.py
# ------------------------------
print("__init__.py", flush=True)

import multiprocessing


def main():
    print("Hi from the main function!", flush=True)
    p = multiprocessing.Process(
        target=print,
        args=("Hi from the process!",),
        kwargs={'flush': True}
    )
    p.start()
    p.join()
# ------------------------------
# __main__.py
# ------------------------------
print("__main__.py", flush=True)

from . import main

if __name__ == __name__ == "__main__":
    print("Hi from the main file!", flush=True)
    main()
# ------------------------------
# test.py
# ------------------------------
print("test.py", flush=True)

import test_package

if __name__ == "__main__":
    print("Hi from the test script!", flush=True)
    test_package.main()

Запуск test.py, как и ожидалось, выдает следующее:

IN > python test.py
OUT> test.py
     __init__.py
     Hi from the test script!
     Hi from the main function!
     test.py
     __init__.py
     Hi from the process!

Однако, когда я запускаю модуль как скрипт, используя python -m, Я получаю это:

IN > python -m test_package
OUT> __init__.py
     __main__.py
     Hi from the main file!
     Hi from the main function!
     Hi from the process!

Я ожидаю, что __init__.py будет напечатан до вывода дочернего процесса. Чем отличаются эти два варианта использования;что мне не хватает?

...