¿En qué núcleos de CPU se ejecutan mis procesos Python?

La puesta en marcha

He escrito una pieza de software bastante compleja en Python (en una PC con Windows). Mi software inicia básicamente dos shells de intérpretes de Python. El primer shell se inicia (supongo) cuando haces doble clic en elmain.py archivo. Dentro de ese shell, otros hilos se inician de la siguiente manera:

    # 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()

losMain_thread comienza unTCP_thread y unUDP_thread. Aunque estos son subprocesos separados, todos se ejecutan dentro de un único shell de Python.

losMain_threadTambién inicia un subproceso. Esto se hace de la siguiente manera:

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

De la documentación de Python, entiendo que este subproceso se está ejecutandosimultaneamente (!) en una sesión / intérprete de intérprete de Python separada. losMain_threaden este subproceso está completamente dedicado a mi GUI. La GUI inicia unTCP_thread para todas sus comunicaciones.

Sé que las cosas se ponen un poco complicadas. Por lo tanto, he resumido toda la configuración en esta figura:

Tengo varias preguntas sobre esta configuración. Los enumeraré aquí abajo:

Pregunta 1 [Resuelto]

¿Es cierto que un intérprete de Python usa solo un núcleo de CPU a la vez para ejecutar todos los hilos? En otras palabras, ¿elPython interpreter session 1 (de la figura) ejecute los 3 hilos (Main_thread, TCP_thread yUDP_thread) en un núcleo de CPU?

Respuesta: sí, esto es cierto. El GIL (Global Interpreter Lock) asegura que todos los hilos se ejecuten en un núcleo de CPU a la vez.

Pregunta 2 [Aún no resuelto]

¿Tengo una manera de rastrear qué núcleo de CPU es?

Pregunta 3 [Parcialmente resuelto]

Para esta pregunta nos olvidamos dehilos, pero nos centramos en elsubproceso mecanismo en Python. Iniciar un nuevo subproceso implica iniciar un nuevo intérprete de Pythonejemplo. ¿Es esto correcto?

Respuesta: Sí, esto es correcto. Al principio hubo cierta confusión sobre si el siguiente código crearía una nueva instancia de intérprete de Python:

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

El problema ha sido aclarado. Este código de hecho inicia una nueva instancia de intérprete de Python.

¿Python será lo suficientemente inteligente como para hacer que esa instancia de intérprete de Python se ejecute en un núcleo de CPU diferente? ¿Hay alguna manera de rastrear cuál, quizás con algunas declaraciones impresas esporádicas también?

Pregunta 4 [Nueva pregunta]

La discusión comunitaria planteó una nueva pregunta. Aparentemente hay dos enfoques al generar un nuevo proceso (dentro de una nueva instancia de intérprete de 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,))

El segundo enfoque tiene el inconveniente obvio de que apunta solo a una función, mientras que necesito abrir un nuevo script de Python. De todos modos, ¿ambos enfoques son similares en lo que logran?

Respuestas a la pregunta(3)

Su respuesta a la pregunta