Utilizzo di Multiprocessing per il Calcolo Parallelo in Python

by theArchitect
SHARE
Utilizzo di Multiprocessing per il Calcolo Parallelo in Python
© Guida-HTML5.it

Introduzione

Il calcolo parallelo è una tecnica fondamentale per migliorare le prestazioni delle applicazioni, specialmente quando si tratta di elaborare grandi volumi di dati o eseguire operazioni computazionali intensive. In Python, il modulo multiprocessing consente di sfruttare più processi per eseguire attività in parallelo, superando le limitazioni del Global Interpreter Lock (GIL). In questo tutorial, esploreremo come utilizzare il modulo multiprocessing per eseguire calcoli in parallelo, migliorando così l´efficienza delle nostre applicazioni.

Codice completo

import multiprocessing
import time

def calcola_fattoriale(n):
    """Funzione per calcolare il fattoriale di un numero."""
    if n == 0 or n == 1:
        return 1
    else:
        return n * calcola_fattoriale(n - 1)

def worker(n, queue):
    """Funzione del worker che calcola il fattoriale e lo mette nella coda."""
    print(f"Calcolo del fattoriale di {n} in corso...")
    result = calcola_fattoriale(n)
    queue.put((n, result))

if __name__ == "__main__":
    numeri = [5, 10, 15, 20, 25]  # Numeri di cui calcolare il fattoriale
    processi = []
    queue = multiprocessing.Queue()

    # Creazione e avvio dei processi
    for numero in numeri:
        p = multiprocessing.Process(target=worker, args=(numero, queue))
        processi.append(p)
        p.start()

    # Attesa della terminazione di tutti i processi
    for p in processi:
        p.join()

    # Raccolta dei risultati
    while not queue.empty():
        numero, risultato = queue.get()
        print(f"Il fattoriale di {numero} è {risultato}")

Spiegazione

Nel codice sopra, abbiamo definito una funzione calcola_fattoriale che calcola il fattoriale di un numero in modo ricorsivo. La funzione worker è responsabile dell´esecuzione del calcolo e dell´inserimento del risultato in una coda. Utilizziamo una coda per facilitare la comunicazione tra i processi.

Nel blocco if __name__ == "__main__", definiamo una lista di numeri per i quali vogliamo calcolare il fattoriale. Creiamo un processo per ciascun numero, avviandolo con p.start(). Dopo aver avviato tutti i processi, utilizziamo p.join() per attendere che tutti i processi terminino.

Infine, raccogliamo i risultati dalla coda e li stampiamo. Questo approccio consente di eseguire i calcoli in parallelo, riducendo il tempo totale di esecuzione rispetto a un approccio sequenziale.

Best practice

  • Utilizza la coda per la comunicazione: Quando lavori con più processi, utilizzare una coda è una buona pratica per scambiare dati in modo sicuro e ordinato.
  • Gestisci le eccezioni: Assicurati di gestire le eccezioni all´interno dei processi per evitare che un errore in un processo interrompa l´intero programma.
  • Limita il numero di processi: Creare troppi processi può sovraccaricare il sistema. Prova a limitare il numero di processi attivi in base alle risorse disponibili.
  • Usa il modulo Pool per carichi di lavoro uniformi: Se hai un numero elevato di compiti simili, considera l´uso di multiprocessing.Pool per gestire automaticamente il numero di processi.

Riepilogo

In questo tutorial, abbiamo esplorato come utilizzare il modulo multiprocessing di Python per eseguire calcoli in parallelo. Abbiamo visto come creare processi, gestire la comunicazione tra di essi tramite code e raccogliere i risultati. L´approccio del multiprocessing è particolarmente utile per applicazioni che richiedono elaborazioni intensive, consentendo di migliorare significativamente le prestazioni.

Approfondisci con risorse ufficiali

SHARE