Multihilo y multiprocesamiento - Procesamiento Paralelo en Python

Introducción:

Hola amigos de Internet, les doy la bienvenida a Mi Diario Python, el mejor blog para Aprender Python.

"Muchas manos hacen el trabajo ligero", este es un refrán que ilustra la ventaja que nos ofrece el multiprocesamiento.

En el este articulo nos centraremos en entender y saber como utilizar el procesamiento paralelo en Python. 

Realizaremos 2 ejemplos. El primero nos ayudara a entender el proceso de multihilos y el segundo sera un ejemplo del multiprocesamiento.

Imagen relacionada

Multihilo y Multiprocesamiento

Antes de empezar a trabajar, debes trazar las diferencias entre multihilo y multiprocesamiento, ya que ambos son procesos diferentes y son utilizados en determinados procedimientos.

El multiprocesamiento son múltiples procesos que se ejecutan utilizando  uno o mas procesadores. 

Multihilo es el proceso en el que multiples hilos se ejecutan al mismo tiempo en un proceso.

Procesos mejorados con Multihilos:
  • Webscraping
  • leer y escribir en archivos
  • compartir datos entre programas
  • comunicaciones de red
Procesos intensivos en CPU mejorados utilizando el multiprocesammiento:
  • calculos
  • formatos de texto
  • cambio de imagen
  • análisis de datos

Ejemplo de Multihilos:

Realicemos un ejemplo. Para ello utilizaremos el modulo threading de la libreria estandar de Python.

import threading
import datetime
 
class ThreadClass(threading.Thread):
    
  def run(self):
    now = datetime.datetime.now()
    print("%s dice hola en el tiempo: %s" % 
    (self.getName(), now))
 
for i in range(2):
  t = ThreadClass()
  t.start()


Thread-1 dice hola en el tiempo: 2018-07-30 12:31:56.951899
Thread-2 dice hola en el tiempo: 2018-07-30 12:31:56.985901

Como podemos observar al ejecutar el ejemplo, los mensajes se imprimen en pantalla al mismo tiempo.

Al importar el modulo threading tenemos acceso a todos sus métodos. Para poder imprimir el tiempo en el que se ejecuta cada proceso hemos importado el modulo datetime.

En el ejemplo hemos creado una clase llamada "ThreadClass", la cual hereda métodos de la clase "Thread" perteneciente al modulo "threading". 

En el método run definimos los procesos que se ejecutaran. Luego de crear la instancia de nuestra clase, observa,os que llamamos al método start para iniciar los procesos.

Ejemplo de Multiprocesamiento:

A continuación, realizaremos un ejemplo de multiprocesamiento utilizando el modulo multiprocessing de la librería estándar de Python.

from multiprocessing.dummy import Pool as ThreadPool
import urllib3

pool = ThreadPool(4) 

urls = [
'https://www.python.org', 'https://www.yahoo.com',
'https://www.google.com', 'https://pythondiario.com'
]

results = pool.map(urllib3.connection_from_url, urls)

for re in results:
    print(re)

pool.close() 
pool.join()

HTTPSConnectionPool(host='www.python.org', port=443)
HTTPSConnectionPool(host='www.yahoo.com', port=443)
HTTPSConnectionPool(host='www.google.com', port=443)
HTTPConnectionPool(host='pythondiario.com', port=80)

El código anterior, tienen el objetivo de hacer una conexión a 4 servidores web mediante su respectiva URL.

Lo que hacemos es crear una instancia de ThreadPool y pasarle como argumento el numero de trabajos (procesos) que se realizaran paralelamente, en este caso 4. Luego declaramos una lista con las URL a las cuales realizaremos conexiones. Creamos una variables "result" la cual contendrá el resultado de los procesos. 

De no usar "multiprocessing", tendríamos que esperar que se estableciera una conexión por vez.  

Te recomiendo seguir leyendo sobre este tema:

¿Te gusta este tipo de tema? Déjamelo saber para escribir más artículos como este.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes 
  1. Unknown dice:

    Hola buen dia, me gustaría saber mas de este tema, si pudieran explicar este tema enfocado hacia Raspberry seria muy interesante.
    Gracias me gustan muchos sus articulos

  2. Ron dice:

    Muy interesante. Gracias

  3. Humanoide dice:

    Este comentario ha sido eliminado por el autor.

  4. mauro dice:

    muy interesante el articulo, soy nuevo en Python y estoy investigando sobre el multiprocesamiento para obtener información de un campo de un dataframe el cual viene con una estructura {{campo1, valor1},{campo2,valor2},...,{campon,valorn}}

    estuve probando manejos con arreglos convirtiendo a un json para poder parsear la información, pero los tiempos son elevados.

  5. Anónimo dice:

    Muchas Gracias. Me sirvio como ayuda rapida.
    Nuevamente Muchas Gracias

  6. Anónimo dice:

    Muchas Gracias. Me sirvio como ayuda rapida.
    Nuevamente Muchas Gracias
    Jose D. Botto

  7. Rene Panjon dice:

    SAludos, hice dos codigos practicamente iguales, solo que en uno usaba hilos y en otro procesos, al momento de medir el tiempo me salia mayor en el de procesos, me dijeron que algo debe estar mal, porque python se comporta mejor con procesos, que hay de cierto en ello. Agradezco sus respuestas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey