- 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
...