Python tiene muchas tareas y actividades en segundo plano; estas tareas se denominan procesos. Y así como una especie de serpiente puede tener subespecies, el proceso de Python puede tener subprocesos. Si bien esta información puede parecer abrumadora, la verdad es que puede hacer que nuestro trabajo sea más manejable.
¿Qué es un subproceso en Python?
Un subproceso es una tarea creada por un proceso para realizar una tarea dentro de su proceso principal. Vamos a expandirlo; proceso es una tarea realizada por un programa mientras se está ejecutando. En muchos casos, si no en todos, los procesos tienden a tener tareas más pequeñas que deben completarse antes de que finalice el proceso.
Aquí es donde entran en juego los subprocesos. Cuando un proceso tiene una tarea menor que debe completarse, puede generarse un subproceso para manejar esa tarea mientras el proceso aún se está ejecutando. Esto crea una forma más fluida y eficiente de administrar los datos y la memoria.
Si se creara un nuevo proceso para cada tarea que el proceso debe realizar, los dispositivos se quedarían rápidamente sin memoria para realizar las tareas. Además, esta metodología sería muy ineficiente debido a la sobrecarga que, en última instancia, supondría para los procesadores de los dispositivos.
Al crear pequeños subprocesos para manejar tareas más simples dentro de un proceso, podrá ejecutar más procesos simultáneamente. Esto se denomina multiprocesamiento, un paquete agregado a Python para admitir múltiples procesadores. Como un lenguaje más antiguo, Python no admitía este tipo de rendimiento porque los dispositivos no tenían tantas CPU en ese entonces.
Hecho histórico: El módulo de subproceso se agregó en Python 2.4 para mejorar el rendimiento y reemplazar los métodos de administración de datos y memoria obsoletos. Poco después de agregar subprocesos, Python agregó un módulo de multiprocesamiento incluido en Python 2.6 y superior. Esta adición al paquete de multiprocesamiento tenía como objetivo mejorar aún más el rendimiento del software en dispositivos con múltiples procesadores.
Cómo usar un subproceso en Python
Antes de usar subprocesos en Python, hablemos de cómo funciona con un ejemplo relativamente común para usuarios de computadoras. Todas las computadoras tienen un administrador de tareas; este programa está diseñado para observar los procesos que se ejecutan en su computadora. Su computadora asigna algo de RAM y espacio de CPU para cada proceso en ejecución. Este concepto es común, pero lo que muchos usuarios no saben es que estos procesos suelen ejecutar tareas.
Para usar un subproceso en Python, debe crearlo. Python tiene un método en un módulo de subproceso llamado conexión, que inicia un nuevo proceso. El método acepta un comando que le dice al subproceso qué acción debe realizar.
Por ejemplo, para ejecutar el bloc de notas de Windows como un subproceso para un proceso principal, pase una cadena su /ruta/al/programa/notepad.exe, incluyendo su camino. Esto permite que el subproceso localice notepad.exe usando la ruta provista, luego abra y ejecute el archivo.
import subprocesscode = subprocess.call("notepad.exe")
if code == 0:
print("Success!")
else:
print("Error!")
Success!
Un ejemplo de un subproceso de Python
El subproceso contiene más que un simple método de llamada; incluye un método Popen (). El método Popen no espera a que se complete el subproceso antes de devolver la información. Para hacer esto con Popen, debe usar el método de espera () después de Popen. Veamos tres ejemplos del uso de un subproceso.
En este ejemplo, verá el subproceso utilizado para hacer ping al sitio y verificar su estado de ejecución.
Usando el método Popen
El método Popen no espera a que se complete el proceso para devolver un valor. Esto significa que la información que recibirá de vuelta no estará completa. En su lugar, recibirá una respuesta de que el trabajo de inicio ha comenzado pero nada ha terminado.
program = "notepad.exe"
subprocess.Popen(program)/*response*/
<subprocess.Popen object at 0x01EE0430>
El código anterior ejecutará con éxito el programa, pero no obtendrá ninguna información sobre el resto del proceso. Para obtener información sobre la función completa de un proceso y averiguar si se han producido errores en tiempo de ejecución, debe utilizar el método de espera.
Usando Popen con el método de espera
program = "notepad.exe"
process = subprocess.Popen(program)
code = process.wait()
print(code)/*result*/
0
El método de espera espera que se devuelva un valor hasta que finalice el subproceso, en cuyo caso devuelve cero, lo que significa que no hubo errores.
Hay casos en los que no se puede usar el método wait () porque puede hacer que el programa se bloquee hasta que se resuelva, en particular cuando se usa stdout / stderr = PIPE. En tales casos, se puede utilizar el método de comunicación () en lugar de esperar (). Echemos un vistazo a cómo se hace esto a continuación.
args = ["ping", "www.google.com"]
process = subprocess.Popen(args, stdout=subprocess.PIPE)
data = process.communicate()
print(data)
Por el bien de esta publicación, el resultado de esta acción es irrelevante para su funcionamiento. Sin embargo, vale la pena prestar atención a la información devuelta por methodęcommunica () que es una tupla de dos elementos que contiene lo que estaba en stdout y stderr.
Uso del módulo de subprocesos en el software
A estas alturas, debe asegurarse de comprender cómo funcionan los subprocesos de Python y qué significan para sus necesidades de desarrollo. Todavía hay mucho que considerar con respecto a los subprocesos, incluidas otras formas de interactuar con ellos. Es un tema amplio, pero está más que listo para pasar a través de él para aprender aún más sobre ellos. Siga leyendo para conocer estos pensamientos finales sobre los subprocesos a tener en cuenta a medida que avanza.
- Los subprocesos son una excelente manera de maximizar el rendimiento del código.
- Los subprocesos se pueden llamar de dos formas principales usando los métodos call () o Popen ().
- El método de espera () es necesario para capturar el resultado completo del proceso cuando se usa el método Popen ().
- Wait () puede causar un interbloqueo cuando se usa con stdout / stderr = PIPE
- Puede usar el método de comunicación () cuando la espera no es una buena opción.
Con estos hechos en la mano y los ejemplos anteriores, está listo para comenzar a usar el módulo de subprocesos en su software.








