Ejemplo de multiprocesamiento en Python

En nuestro tutorial anterior, aprendimos sobre el ejemplo CSV de Python . En este tutorial, aprenderemos sobre el multiprocesamiento de Python con ejemplos.

Multiprocesamiento en Python

El procesamiento paralelo está recibiendo cada vez más atención en la actualidad. Si aún no sabes sobre el procesamiento paralelo, aprende de Wikipedia . A medida que los fabricantes de CPU comienzan a agregar más y más núcleos a sus procesadores, crear código paralelo es una excelente manera de mejorar el rendimiento. Python introdujo el módulo de multiprocesamiento para permitirnos escribir código paralelo. Para comprender la motivación principal de este módulo, debemos conocer algunos conceptos básicos sobre programación paralela. Después de leer este artículo, esperamos que puedas adquirir algunos conocimientos sobre este tema.

Procesos, colas y bloqueos de multiprocesamiento en Python

Hay muchas clases en el módulo de multiprocesamiento de Python para crear un programa paralelo. Entre ellas, tres clases básicas son Process, Queuey Lock. Estas clases te ayudarán a crear un programa paralelo. Pero antes de describirlas, comencemos este tema con un código simple. Para que un programa paralelo sea útil, debes saber cuántos núcleos hay en tu computadora. El módulo de multiprocesamiento de Python te permite saberlo. El siguiente código simple imprimirá la cantidad de núcleos en tu computadora.

import multiprocessingprint("Number of cpu : ", multiprocessing.cpu_count())

El resultado que se muestra a continuación puede variar para su PC. En mi caso, la cantidad de núcleos es 8.

Clase de proceso de multiprocesamiento de Python

La clase multiprocesamiento de Python Processes una abstracción que configura otro proceso de Python, le proporciona la posibilidad de ejecutar código y una forma para que la aplicación principal controle la ejecución. Hay dos funciones importantes que pertenecen a la clase Process: start()y join()function. Primero, necesitamos escribir una función, que será ejecutada por el proceso. Luego, necesitamos crear una instancia de un objeto de proceso. Si creamos un objeto de proceso, no sucederá nada hasta que le indiquemos que comience a procesar a través de start()la función. Luego, el proceso se ejecutará y devolverá su resultado. Después de eso, le indicamos al proceso que complete a través de join()la función. Sin join()la llamada a la función, el proceso permanecerá inactivo y no terminará. Entonces, si crea muchos procesos y no los termina, puede enfrentar la escasez de recursos. Entonces, es posible que deba matarlos manualmente. Una cosa importante es que, si desea pasar cualquier argumento a través del proceso, debe usar argsla palabra clave argument. El siguiente código será útil para comprender el uso de la clase Process.

from multiprocessing import Processdef print_func(continent='Asia'):    print('The name of continent is : ', continent)if __name__ == "__main__":  # confirms that the code is under main function    names = ['America', 'Europe', 'Africa']    procs = []    proc = Process(target=print_func)  # instantiating without any argument    procs.append(proc)    proc.start()    # instantiating process with arguments    for name in names:        # print(name)        proc = Process(target=print_func, args=(name,))        procs.append(proc)        proc.start()    # complete the processes    for proc in procs:        proc.join()

La salida del siguiente código será:

Clase de cola de multiprocesamiento de Python

Tienes conocimientos básicos sobre la estructura de datos de la computadora, probablemente sepas sobre las colas. Los módulos de multiprocesamiento de Python proporcionan Queueuna clase que es exactamente una estructura de datos del tipo primero en entrar, primero en salir . Pueden almacenar cualquier objeto pickle de Python (aunque los más simples son los mejores) y son extremadamente útiles para compartir datos entre procesos. Las colas son especialmente útiles cuando se pasan como parámetro a la función de destino de un proceso para permitir que el proceso consuma datos. Al usar put()una función, podemos insertar datos en la cola y, al usar get()podemos obtener elementos de las colas. Consulta el siguiente código para ver un ejemplo rápido.

from multiprocessing import Queuecolors = ['red', 'green', 'blue', 'black']cnt = 1# instantiating a queue objectqueue = Queue()print('pushing items to queue:')for color in colors:    print('item no: ', cnt, ' ', color)    queue.put(color)    cnt += 1print('npopping items from queue:')cnt = 0while not queue.empty():    print('item no: ', cnt, ' ', queue.get())    cnt += 1

Clase de bloqueo de multiprocesamiento de Python

La tarea de la clase Lock es bastante simple. Permite que el código reclame un bloqueo de modo que ningún otro proceso pueda ejecutar el código similar hasta que se haya liberado el bloqueo. Por lo tanto, la tarea de la clase Lock es principalmente dos. Una es reclamar el bloqueo y la otra es liberar el bloqueo. Para reclamar el bloqueo acquire()se utiliza la función, y para liberar el bloqueo release()se utiliza la función.

Ejemplo de multiprocesamiento en Python

En este ejemplo de multiprocesamiento de Python, fusionaremos todos nuestros conocimientos. Supongamos que tenemos algunas tareas que realizar. Para realizar esa tarea, utilizaremos varios procesos. Por lo tanto, mantendremos dos colas. Una contendrá las tareas y la otra contendrá el registro de la tarea completada. Luego, instanciamos los procesos para completar la tarea. Tenga en cuenta que la clase Queue de Python ya está sincronizada. Eso significa que no necesitamos usar la clase Lock para bloquear que varios procesos accedan al mismo objeto de cola. Es por eso que no necesitamos usar la clase Lock en este caso. A continuación se muestra la implementación donde agregamos tareas a la cola, luego creamos procesos e iniciamos para luego usarlos join()para completar los procesos. Finalmente, imprimimos el registro de la segunda cola.

from multiprocessing import Lock, Process, Queue, current_processimport timeimport queue # imported for using queue.Empty exceptiondef do_job(tasks_to_accomplish, tasks_that_are_done):    while True:        try:            '''                try to get task from the queue. get_nowait() function will                 raise queue.Empty exception if the queue is empty.                 queue(False) function would do the same task also.            '''            task = tasks_to_accomplish.get_nowait()        except queue.Empty:            break        else:            '''                if no exception has been raised, add the task completion                 message to task_that_are_done queue            '''            print(task)            tasks_that_are_done.put(task + ' is done by ' + current_process().name)            time.sleep(.5)    return Truedef main():    number_of_task = 10    number_of_processes = 4    tasks_to_accomplish = Queue()    tasks_that_are_done = Queue()    processes = []    for i in range(number_of_task):        tasks_to_accomplish.put("Task no " + str(i))    # creating processes    for w in range(number_of_processes):        p = Process(target=do_job, args=(tasks_to_accomplish, tasks_that_are_done))        processes.append(p)        p.start()    # completing process    for p in processes:        p.join()    # print the output    while not tasks_that_are_done.empty():        print(tasks_that_are_done.get())    return Trueif __name__ == '__main__':    main()

Dependiendo de la cantidad de tareas, el código tardará un tiempo en mostrar el resultado. El resultado del siguiente código variará de vez en cuando.

Grupo de multiprocesamiento de Python

El pool de multiprocesamiento de Python se puede utilizar para la ejecución paralela de una función en varios valores de entrada, distribuyendo los datos de entrada entre los procesos (paralelismo de datos). A continuación se muestra un ejemplo simple de pool de multiprocesamiento de Python.

from multiprocessing import Poolimport timework = (["A", 5], ["B", 2], ["C", 1], ["D", 3])def work_log(work_data):    print(" Process %s waiting %s seconds" % (work_data[0], work_data[1]))    time.sleep(int(work_data[1]))    print(" Process %s Finished." % work_data[0])def pool_handler():    p = Pool(2)    p.map(work_log, work)if __name__ == '__main__':    pool_handler()

La imagen de abajo muestra el resultado del programa anterior. Observe que el tamaño del grupo es 2, por lo que work_logse están ejecutando dos funciones en paralelo. Cuando finaliza el procesamiento de una de las funciones, selecciona el siguiente argumento y así sucesivamente. Eso es todo para el módulo de multiprocesamiento de Python. Referencia: Documentación oficial

SUSCRÍBETE A NUESTRO BOLETÍN 
No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

Deja un comentario

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

Scroll al inicio