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