Cosa rende un'API intelligente?
Pratico Machine Learning da quasi 3-4 anni ormai. Nel periodo ho addestrato molti modelli, implementato molte pipeline di dati e molto altro. Nota: ho sicuramente raccolto e ripulito molti più dati rispetto al numero di modelli che ho mai costruito .
Uno degli aspetti cruciali dell'essere nello spettro ML è essere in grado di rendere prontamente disponibili agli altri i tuoi pensieri o le tue implementazioni .
Lascia che te lo spieghi.
Potrebbe essere spiegare a una persona non tecnica come funziona un algoritmo in termini profani, come servire i tuoi modelli in un'API o persino documentare il tuo lavoro in modo che qualcuno che non conosce i tuoi progetti possa facilmente aggiornarsi su ciò che hai fatto così lontano, e molti altri. In questo articolo, ci concentreremo sulle API .
L'API (Application Programming Interface) non è altro che un mezzo che facilita la comunicazione tra la fonte e l'utente finale . Quasi tutte le applicazioni che utilizziamo nella nostra vita quotidiana comprendono centinaia (se non di più) di API che svolgono il lavoro pesante nel back-end in modo da poter utilizzare l'applicazione a proprio agio. Un'API si comporta in modo richiesta-risposta . Questo potrebbe variare da pochi millisecondi a ben oltre pochi minuti.
Immagina di andare da Starbucks e ordinare un Frappuccino al caramello con panna extra (il mio preferito ) proprio prima di partecipare a quella lunghissima riunione
Cosa succede dopo? Bene,
Probabilmente aspetteresti i prossimi 4-5 minuti entro i quali viene effettuato il tuo ordine, quindi verrebbe preparato in cucina e il cameriere ti consegnerebbe il tuo delizioso Frappuccino. In questo caso sei l' utente finale, la cucina diventa la fonte e il cameriere che ti porta il Frappuccino dalla cucina fa da API .
Suona abbastanza chiaro?
Supponiamo ora che siano trascorsi più di 30 minuti e che il tuo Frappuccino non ti sia ancora stato dato. Non perderesti la pazienza? O almeno non te ne andresti per partecipare a quella riunione che hai tra 10 minuti per tutto il tempo sentendoti molto deluso?
Questo è esattamente il modo in cui si sentirebbe l'utente finale della tua applicazione se si verificano molti ritardi nel restituire la risposta. La latenza è fondamentale quando si tratta di progettare l'app perfetta.
Ora supponiamo anche con il miglior artista del caffè, preparare un Frappuccino al caramello richiederebbe niente di meno di 30 minuti. Ordineresti comunque il Frappuccino o sceglieresti un'opzione alternativa che ha un tempo di preparazione inferiore? Nella maggior parte dei casi, sceglierai l'opzione alternativa, vero?
Ma cosa succede se il barista dice come cito, vai a quella riunione, mi assicurerò che il Frappuccino sia nella tua sala conferenze prima che tu raggiunga!
Sembra un affare interessante, vero?
Perché non possiamo creare un'API che possa comportarsi allo stesso modo?
Lasciatemi spiegare.
Puoi creare un'API che restituirà una risposta istantaneamente quando l'utente invia una richiesta a un'API. Ma il lavoro pesante viene svolto in background ( questo potrebbe richiedere del tempo ). Con un'API di questo tipo, puoi assicurarti che il tempo di esecuzione non influisca mai sul tempo complessivo impiegato per restituire una risposta.
Celery e FastAPI forniscono un meccanismo di messaggistica ottimizzato. In questo articolo, ci concentreremo solo su FastAPI (grazie a Sebastián Ramírez per aver creato questo GEM), che è anche il mio framework API Python preferito. Supporta l'attività in background che si allinea perfettamente con ciò che abbiamo discusso ora.
Se non conosci FastAPI, dai un'occhiata a questo blog su FastAPI per ottenere un punto di partenza per capire cosa sto per spiegare in questo articolo.
Introduzione a FastAPIDa qui in poi presumo che tu sappia come costruire un'API di base usando FastAPI.
Iniziamo?
Creiamo un'API che restituirà "Hello world" dopo 10 secondi.
from fastapi import FastAPI
import time
app = FastAPI()
@app.post("/myApp/timer")
def read_item():
start = time.time() # start time
time.sleep(10)
end = time.time() # end time
print(end - start) # print the time taken to return the response
return {"response": "Hello world!"}
Puoi notare che la risposta API viene restituita dopo 10.0037s e anche l'istruzione di stampa è più o meno nello stesso periodo
Di seguito è riportato il tempo impiegato per 10 chiamate API che ho effettuato
Il tempo medio impiegato è di circa 10.002 secondi
Ora aggiungiamo la capacità di tasking in background sulla stessa API. Per fare ciò, puoi utilizzare la funzionalità Attività in background in FastAPI. Basta creare una funzione chiamata return_response che stampa "Ciao mondo!" chiamandolo. Invoca quella funzione usando il metodo BackgroundTasks all'interno dell'API e il gioco è fatto!
from fastapi import BackgroundTasks, FastAPI
import time
app = FastAPI()
def return_response():
start = time.time() # start time
time.sleep(10)
end = time.time() # end time
print({
"response": "Hello world!",
"time_taken": end - start
})
@app.post("/myApp/timer")
def read_item(background_tasks: BackgroundTasks):
start = time.time() # start time
background_tasks.add_task(return_response) # background processing the function
end = time.time() # end time
return {
"status": "processing in background",
"time_taken": end - start
}
Mentre l'istruzione print può essere vista nel terminale dopo 10 secondi
Puoi vedere qui che il tempo impiegato dall'API per restituire la risposta si è ridotto da 10.002s a soli 0.00034s mentre l'istruzione print viene fornita dopo 10.0043s
La creazione di un'API in questo modo assicura che la tua risposta venga data quasi istantaneamente spostando il lavoro pesante in background.
Ricorda che la funzionalità BackgroundTasks funzionerebbe al meglio solo nei casi in cui la tua applicazione può archiviare la risposta API in una fonte esterna (MySQL, DynamoDB, ecc.) e non richiede all'utente finale di visualizzarla al momento di ottenere la risposta.
Spero che questo ti aiuti a ristrutturare la tua API con tempi di elaborazione molto inferiori. A presto con altri articoli interessanti.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































