Conținut curs
Python Avansat
Despre lecție
  1. Introducere în programarea asincronă

    • Conceptul de programare asincronă
    • Diferența dintre programarea sincronă și cea asincronă
    • Scenarii de utilizare a programării asincrone
  2. Biblioteca asyncio în Python

    • Prezentarea bibliotecii asyncio
    • Crearea și gestionarea corutinelor și a task-urilor
    • Utilizarea buclelor de evenimente pentru executarea asincronă a codului
  3. Operarea cu I/O asincron

    • Introducere în I/O asincron
    • Lucrul cu socket-uri asincrone
    • Implementarea serverelor și a clienților asincroni
  4. Biblioteca aiohttp

    • Prezentarea bibliotecii aiohttp
    • Crearea de servere și clienți HTTP asincroni
    • Lucrul cu sesiuni și conexiuni HTTP asincrone
  5. Încorporarea programării asincrone în aplicații reale

    • Exemple de scenarii în care programarea asincronă este utilă
    • Implementarea de aplicații web asincrone
    • Îmbunătățirea performanței aplicațiilor prin utilizarea programării asincrone
  6. Gestionarea erorilor și a excepțiilor în programarea asincronă

    • Identificarea și tratarea erorilor comune în programarea asincronă
    • Utilizarea blocurilor try-except în corutine și task-uri asincrone

Exemple și exerciții pentru fiecare subpunct:

Exemplu: Utilizarea corutinelor și a buclelor de evenimente

python
import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World!")

async def main():
    task = asyncio.create_task(say_hello())
    await task

asyncio.run(main())

Exercițiu:

Creați o corutină care să efectueze o operație asincronă, cum ar fi o întârziere de timp, și să afișeze un mesaj după finalizarea acesteia.

Exemplu: Implementarea unui server TCP asincron

python
import asyncio

async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info("peername")

    print(f"Mesaj primit de la {addr}: {message}")

    response = "Mesaj primit"
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def main():
    server = await asyncio.start_server(handle_client, "localhost", 12345)
    addr = server.sockets[0].getsockname()

    print(f"Server asincron pornit la adresa {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())

Exercițiu:

Creați un server TCP asincron care să accepte și să gestioneze multiple conexiuni simultan.

Exemplu: Utilizarea bibliotecii aiohttp pentru a efectua cereri HTTP asincrone

python
import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    url = "https://example.com"
    html = await fetch(url)
    print(f"Conținutul paginii {url}:")
    print(html)

asyncio.run(main())

Exercițiu:

Creați o corutină care să efectueze mai multe cereri HTTP asincrone către diferite site-uri web și să afișeze conținutul acestora.

Exemplu: Gestionarea erorilor în corutine asincrone

python
import asyncio

async def faulty_coroutine():
    try:
        await asyncio.sleep(1)
        raise ValueError("A apărut o eroare!")
    except ValueError as e:
        print(f"Eroare tratată: {e}")

async def main():
    task = asyncio.create_task(faulty_coroutine())
    await task

asyncio.run(main())

Exercițiu:

Creați o corutină care să efectueze o operație asincronă și să trateze o excepție posibilă care ar putea apărea în timpul execuției.

Rezumat:

În această lecție, am discutat despre programarea asincronă avansată cu asyncio și biblioteca aiohttp. Am explorat conceptele de bază ale programării asincrone și am învățat cum să lucrăm cu corutine, task-uri și bucle de evenimente. De asemenea, am aprofundat operarea cu I/O asincron și am explorat cum să folosim biblioteca aiohttp pentru a realiza servere și clienți HTTP asincroni. În final, am discutat despre gestionarea erorilor și a excepțiilor în programarea asincronă.