Esercizi Asyncio Python
Codegrind Team•Jul 10 2024
Scopri la programmazione asincrona con asyncio
in Python attraverso questi esercizi introduttivi.
Esercizio 1
Creare un'attività asincrona che stampa i numeri da 1 a 10 con un intervallo di un secondo tra ciascuno.
import asyncio
async def print_numbers():
for i in range(1, 11):
print(i)
await asyncio.sleep(1)
async def main():
await print_numbers()
asyncio.run(main())
Esercizio 2
Scrivere un programma che avvia due task asincroni; uno stampa numeri pari e l'altro numeri dispari fino a 10.
import asyncio
async def print_even():
for i in range(2, 11, 2):
print(f"Pari: {i}")
await asyncio.sleep(1)
async def print_odd():
for i in range(1, 11, 2):
print(f"Dispari: {i}")
await asyncio.sleep(1)
async def main():
task1 = asyncio.create_task(print_even())
task2 = asyncio.create_task(print_odd())
await task1
await task2
asyncio.run(main())
Esercizio 3
Implementare un task asincrono che esegue un countdown da 10 a 1 e stampa "Fine!" al termine.
import asyncio
async def countdown():
for i in range(10, 0, -1):
print(i)
await asyncio.sleep(1)
print("Fine!")
async def main():
await countdown()
asyncio.run(main())
Esercizio 4
Creare un task asincrono che calcola la somma di un range di numeri e poi stampa il risultato.
import asyncio
async def calculate_sum():
total = sum(range(1, 1001))
await asyncio.sleep(2) # Simulazione di un'operazione lunga
print(f"La somma è: {total}")
async def main():
await calculate_sum()
asyncio.run(main())
Esercizio 5
Utilizzare asyncio per eseguire una funzione che simula il download di file da diverse URL in modo asincrono.
import asyncio
import random
async def download_file(url):
print(f"Inizio download da {url}")
await asyncio.sleep(random.randint(1, 3)) # Simula un tempo di download variabile
print(f"Download completato da {url}")
async def main():
urls = ['http://example.com/a', 'http://example.com/b', 'http://example.com/c']
tasks = [asyncio.create_task(download_file(url)) for url in urls]
await asyncio.gather(*tasks)
asyncio.run(main())
Esercizio 6
Scrivere un programma con asyncio che gestisce un timer che scatta ogni 5 secondi, stampando "Timer scattato!".
import asyncio
async def timer():
while True:
await asyncio.sleep(5)
print("Timer scattato!")
async def main():
await timer()
asyncio.run(main())
Esercizio 7
Creare una funzione asincrona che attende l'input dell'utente e poi stampa quello che è stato inserito.
import asyncio
async def get_input():
result = await asyncio.to_thread(input, "Inserisci qualcosa: ")
print(f"Hai inserito: {result}")
async def main():
await get_input()
asyncio.run(main())
Esercizio 8
Implementare una funzione asincrona che esegue un task che può essere cancellato esternamente dopo un certo tempo.
import asyncio
async def cancellable_task():
try:
while True:
print("Esecuzione...")
await asyncio.sleep(1)
except asyncio.CancelledError:
print("Task cancellato")
async def main():
task = asyncio.create_task(cancellable_task())
await asyncio.sleep(5) # Permette al task di eseguire per un po'
task.cancel()
await task
asyncio.run(main())
Esercizio 9
Usare asyncio per implementare un semplice echo server che ascolta su una porta TCP.
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print(f"Ricevuto {message} da {addr}")
writer.write(data)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)
addr = server.sockets[0].getsockname()
print(f'Servendo su {addr}')
async with server:
await server.serve_forever()
asyncio.run(main())
Esercizio 10
Creare un programma asincrono che attende la terminazione di più task asincroni, usando `asyncio.wait` con un timeout.
import asyncio
async def task(name, time_to_sleep):
await asyncio.sleep(time_to_sleep)
print(f"Task {name} completato")
async def main():
tasks = [task(f"Task {i}", i) for i in range(1, 4)]
done, pending = await asyncio.wait(tasks, timeout=2)
for task in done:
print(f"{task.get_name()} finito")
for task in pending:
print(f"{task.get_name()} non finito e cancellato")
task.cancel()
asyncio.run(main())