Python fornisce due modi principali per eseguire la programmazione asincrona:
1. Modulo `asyncio`: introdotto a partire dalla versione Python 3.4, `asyncio` è una libreria per scrivere codice di rete e I/O in file asincrono in un modo a singolo thread, multiplexing I/O su socket e altre risorse, gestione di protocolli a livello di sistema, reti client/server eccetera.
Esempio:
```
import asyncio
async def hello(): print(‘Hello’) await asyncio.sleep(1) print(‘world’)
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()
```
1. Modulo `threading` e `concurrent.futures`: Questi due moduli consentono di sfruttare la programmazione multithreading e multiprocessore rispettivamente. Con questi si possono eseguire task multipli simultaneamente in modo parallelo.
Esempio:
```
from concurrent.futures import ThreadPoolExecutor
import threading
def task(): print(“Executing task on thread {}”.format(threading.current_thread()))
def main(): executor = ThreadPoolExecutor(max_workers=3) task1 = executor.submit(task) task2 = executor.submit(task)
if name == main
main()
```
1. Utilizzare le parole chiave `async` e `await`: A partire da Python 3.5, è possibile definire funzioni asincrone utilizzando la parola chiave `async def`. Al loro interno, si può utilizzare la parola chiave `await` per sospendere l’esecuzione della funzione fino a quando un’operazione asincrona non viene completata.
Esempio:
```
import asyncio
async def main(): print(‘Hello’) await asyncio.sleep(1) print(‘world’)
asyncio.run(main())
```
Un vantaggio importante della programmazione asincrona è che è più efficiente rispetto alla programmazione sincrona per task che implicano operazioni di I/O, come le richieste a un servizio web, poiché consente al programma di fare altro mentre aspetta che queste operazioni si completino.