На каких ядрах процессора работают мои процессы Python?

Настройка

Я написал довольно сложную часть программного обеспечения на Python (на ПК с Windows). Мое программное обеспечение запускает в основном две оболочки интерпретатора Python. Первая оболочка запускается (я полагаю), когда вы дважды щелкнитеmain.py файл. Внутри этой оболочки другие потоки запускаются следующим образом:

    # Start TCP_thread
    TCP_thread = threading.Thread(name = 'TCP_loop', target = TCP_loop, args = (TCPsock,))
    TCP_thread.start()

    # Start UDP_thread
    UDP_thread = threading.Thread(name = 'UDP_loop', target = UDP_loop, args = (UDPsock,))
    TCP_thread.start()

Main_thread начинаетTCP_thread иUDP_thread, Хотя это отдельные потоки, все они работают в одной оболочке Python.

Main_threadтакже запускает подпроцесс. Это делается следующим образом:

p = subprocess.Popen(['python', mySubprocessPath], shell=True)

Из документации Python я понимаю, что этот подпроцесс работаетодновременно (!) в отдельном сеансе / оболочке интерпретатора Python.Main_threadв этом подпроцессе полностью посвящен мой графический интерфейс. GUI запускаетTCP_thread для всех его сообщений.

Я знаю, что все становится немного сложнее. Поэтому я суммировал всю установку на этом рисунке:

У меня есть несколько вопросов, касающихся этой настройки. Я перечислю их здесь:

Вопрос 1 [решаемая]

Правда ли, что интерпретатор Python одновременно использует только одно ядро ​​ЦП для запуска всех потоков? Другими словами, будет лиPython interpreter session 1 (из рисунка) запустить все 3 потока (Main_thread, TCP_thread а такжеUDP_thread) на одном ядре процессора?

Ответ: да, это правда. GIL (Global Interpreter Lock) обеспечивает одновременную работу всех потоков на одном ядре ЦП.

вопрос 2 [Еще не решена]

У меня есть способ отследить, какое ядро ​​процессора это?

Вопрос 3 [Частично решено]

По этому вопросу мы забываем опотоки, но мы сосредоточены наподпроцесс механизм в Python. Запуск нового подпроцесса подразумевает запуск нового интерпретатора Pythonпример, Это правильно?

Ответ: Да, это правильно. Сначала возникла путаница относительно того, будет ли следующий код создавать новый экземпляр интерпретатора Python:

    p = subprocess.Popen(['python', mySubprocessPath], shell = True)

Вопрос был уточнен. Этот код действительно запускает новый экземпляр интерпретатора Python.

Будет ли Python достаточно умен, чтобы этот отдельный экземпляр интерпретатора Python работал на другом ядре ЦП? Есть ли способ отследить какой, возможно, с помощью некоторых спорадических печатных заявлений?

Вопрос 4 [Новый вопрос]

Дискуссия сообщества подняла новый вопрос. Очевидно, есть два подхода при создании нового процесса (в новом экземпляре интерпретатора Python):

    # Approach 1(a)
    p = subprocess.Popen(['python', mySubprocessPath], shell = True)

    # Approach 1(b) (J.F. Sebastian)
    p = subprocess.Popen([sys.executable, mySubprocessPath])

    # Approach 2
    p = multiprocessing.Process(target=foo, args=(q,))

У второго подхода есть очевидный недостаток: он нацелен только на функцию, тогда как мне нужно открыть новый скрипт на Python. Во всяком случае, оба подхода одинаковы в том, что они достигают?

Ответы на вопрос(3)

Ваш ответ на вопрос