Gestión de Procesos Concurrentes en Python

En entornos de programación concurrente, Python ofrece múltiples enfoques para gestionar procesos. Aunque os.fork() es eficaz en sistemas Unix-like, su uso en Windows requiere alternativas como el módulo multiprocessing. A continuación se detallan implementaciones prácticas.

import os

print(f"Proceso inicializado con PID: {os.getpid()}")
identificador = os.fork()

if identificador == 0:
    print(f"Soy proceso hijo (PID: {os.getpid()}), padre: {os.getppid()}")
else:
    print(f"Padre (PID: {os.getpid()}) creó hijo con ID: {identificador}")

Para compatibilidad multiplataforma, el módulo multiprocessing simplifica la creación de procesos:

from multiprocessing import Process
import os

def ejecutar_tarea(nombre):
    print(f"Ejecutando tarea '{nombre}' en PID {os.getpid()}")

if __name__ == "__main__":
    print(f"Proceso principal PID: {os.getpid()}")
    tarea = Process(target=ejecutar_tarea, args=('Datos',))
    tarea.start()
    tarea.join()
    print("Tarea completada")

La gestión eficiente de múltiples procesos se logra con Pool, ajustando el tamaño según núcleos disponibles:

from multiprocessing import Pool
import os, time, random

def procesar_tarea(id_tarea):
    print(f"Tarea {id_tarea} en PID {os.getpid()}")
    inicio = time.time()
    time.sleep(random.uniform(0, 3))
    print(f"Tarea {id_tarea} finalizada en {time.time() - inicio:.2f}s")

if __name__ == "__main__":
    pool = Pool(4)
    for i in range(6):
        pool.apply_async(procesar_tarea, (i,))
    pool.close()
    pool.join()
    print("Todas las tareas completadas")

Para interactuar con procesos externos, subprocess permite controlar entrada/salida:

import subprocess

comando = ['nslookup', '-query=mx', 'ejemplo.com']
resultado = subprocess.run(comando, capture_output=True, text=True)
print(resultado.stdout)
print(f"Código salida: {resultado.returncode}")

La comunicación interproceso mediante colas:

from multiprocessing import Process, Queue
import time, random

def generador(cola):
    for item in ['X', 'Y', 'Z']:
        cola.put(item)
        print(f"Insertado {item} en cola")
        time.sleep(random.random())

def receptor(cola):
    while True:
        item = cola.get()
        print(f"Recibido {item} de cola")

if __name__ == "__main__":
    cola = Queue()
    prod = Process(target=generador, args=(cola,))
    cons = Process(target=receptor, args=(cola,))
    prod.start()
    cons.start()
    prod.join()
    cons.terminate()

Etiquetas: Python multiprocessing interprocess-communication subprocess process-pool

Publicado el 9-29 01:50