Calcolo in parallelo [Python]
Inviato: 27/07/2024, 22:42
Ci sono diverse opzioni disponibili per eseguire calcoli in parallelo in Python. Ecco alcune delle soluzioni più comuni:
Tecnica del MULTIPROCESSING:
In Python, puoi eseguire processi in parallelo utilizzando la libreria multiprocessing. La libreria multiprocessing fornisce un'API simile a quella dei thread e permette di eseguire funzioni in parallelo su più processi.
Per eseguire processi in parallelo con multiprocessing, segui questi passaggi:
1. Importa la libreria multiprocessing:
2. Crea un'istanza dell'oggetto Pool, specificando il numero di processi da utilizzare:
3. Definisci la funzione che deve essere eseguita in parallelo. Ad esempio, la seguente funzione calcola il quadrato di un numero:
4. Usa il metodo apply_async() dell'oggetto Pool per eseguire la funzione in parallelo. Il metodo apply_async() accetta la funzione da eseguire come primo argomento, seguita dai parametri della funzione
5. Usa il metodo get() sull'oggetto restituito dal metodo apply_async() per ottenere il risultato della funzione:
Puoi ripetere i passaggi 4 e 5 per eseguire più funzioni in parallelo.
Di seguito riporto il codice completo:
Nota bene: è importante includere la clausola if __name__ == '__main__': per evitare problemi con la creazione di nuovi processi in Python.
Un altro esempio di utilizzo del modulo multiprocessing potrebbe essere il seguente: definiamo due funzioni worker1() e worker2() che rappresentano i processi che vogliamo eseguire in parallelo. Nella funzione __main__, creiamo due processi process1 e process2, utilizzando il metodo Process() di multiprocessing e specificando le funzioni che vogliamo eseguire come argomenti.
Successivamente, per eseguire i processi, utilizziamo il metodo start() per avviare ogni processo. Successivamente, utilizziamo il metodo join() per attendere che ogni processo termini prima di terminare il programma.
Tecnica del calcolo si più core:
Ecco un esempio pratico dell'utilizzo del modulo multiprocessing per eseguire in parallelo il calcolo di numeri primi.
- multiprocessing: la libreria multiprocessing di Python consente di utilizzare più core del processore per eseguire i calcoli in parallelo. È utile se il programma deve eseguire operazioni costose su grandi quantità di dati.
- threading: Python ha anche la libreria threading per l'esecuzione di calcoli in parallelo. Tuttavia, poiché Python utilizza un'implementazione GIL (Global Interpreter Lock), i thread in Python non possono essere eseguiti su più core del processore.
- asyncio: asyncio è una libreria di Python per la programmazione asincrona. È utile per le applicazioni che devono gestire molte richieste simultaneamente, come le applicazioni web.
- joblib: joblib è una libreria Python che semplifica l'utilizzo di multiprocessing per i calcoli paralleli. È utile quando si deve eseguire la stessa operazione su molte parti di un grande set di dati.

In Python, puoi eseguire processi in parallelo utilizzando la libreria multiprocessing. La libreria multiprocessing fornisce un'API simile a quella dei thread e permette di eseguire funzioni in parallelo su più processi.
Per eseguire processi in parallelo con multiprocessing, segui questi passaggi:
1. Importa la libreria multiprocessing:
Codice: Seleziona tutto
import multiprocessing
Codice: Seleziona tutto
pool = multiprocessing.Pool(processes=4)
Codice: Seleziona tutto
def square(x):
return x*x
Codice: Seleziona tutto
result = pool.apply_async(square, args=(10,))
Codice: Seleziona tutto
print(result.get()) # Output: 100
Di seguito riporto il codice completo:
Codice: Seleziona tutto
import multiprocessing
def square(x):
return x*x
if __name__ == '__main__':
# Crea un'istanza dell'oggetto Pool con 4 processi
with multiprocessing.Pool(processes=4) as pool:
# Esegue la funzione square in parallelo
result1 = pool.apply_async(square, args=(10,))
result2 = pool.apply_async(square, args=(20,))
result3 = pool.apply_async(square, args=(30,))
result4 = pool.apply_async(square, args=(40,))
# Ottiene i risultati
print(result1.get()) # Output: 100
print(result2.get()) # Output: 400
print(result3.get()) # Output: 900
print(result4.get()) # Output: 1600

Un altro esempio di utilizzo del modulo multiprocessing potrebbe essere il seguente: definiamo due funzioni worker1() e worker2() che rappresentano i processi che vogliamo eseguire in parallelo. Nella funzione __main__, creiamo due processi process1 e process2, utilizzando il metodo Process() di multiprocessing e specificando le funzioni che vogliamo eseguire come argomenti.
Successivamente, per eseguire i processi, utilizziamo il metodo start() per avviare ogni processo. Successivamente, utilizziamo il metodo join() per attendere che ogni processo termini prima di terminare il programma.
Codice: Seleziona tutto
import multiprocessing
def worker1():
print("Worker 1 is running")
def worker2():
print("Worker 2 is running")
if __name__ == "__main__":
process1 = multiprocessing.Process(target=worker1)
process2 = multiprocessing.Process(target=worker2)
process1.start()
process2.start()
process1.join()
process2.join()


Codice: Seleziona tutto
...