Sto lavorando su una libreria Python che si interfaccia con un'API del servizio web. Come molti servizi web che ho incontrato, questo richiede di limitare la frequenza delle richieste. Vorrei fornire un parametro facoltativo, limit
, all'istanza di classe che, se fornita, manterrà richieste in uscita fino a quando non passerà il numero di secondi specificato.Come limitare la velocità delle richieste ai servizi Web in Python?
Comprendo che lo scenario generale è il seguente: un'istanza della classe effettua una richiesta tramite un metodo. Quando lo fa, il metodo emette un segnale che imposta una variabile di blocco da qualche parte, e inizia un conto alla rovescia per il numero di secondi in limit
. (Con ogni probabilità, il blocco è il conto alla rovescia stesso.) Se viene fatta un'altra richiesta entro questo intervallo di tempo, deve essere accodata fino a quando il timer per il conto alla rovescia raggiunge lo zero e il blocco è disattivato; a questo punto, viene inviata la richiesta più vecchia in coda e il timer per il conto alla rovescia viene ripristinato e il blocco viene reimpostato.
Si tratta di un caso per la filettatura? C'è un altro approccio che non vedo?
Se il conto alla rovescia e il blocco devono essere variabili di istanza o devono appartenere alla classe, in modo tale che tutte le istanze della classe tengano richieste?
Inoltre, è generalmente una cattiva idea fornire funzionalità di limitazione della velocità all'interno di una libreria? Ho ragione dal momento che, per impostazione predefinita, il conto alla rovescia è zero secondi, la libreria consente comunque agli sviluppatori di utilizzare la libreria e fornire i propri schemi di limitazione della velocità. Dato che tutti gli sviluppatori che utilizzano il servizio dovranno comunque richiedere un limite di velocità, tuttavia, immagino che sarebbe una comodità per la libreria fornire un mezzo di limitazione della velocità.
Indipendentemente dal posizionamento di uno schema di limitazione della velocità nella libreria o meno, voglio scrivere un'applicazione utilizzando la libreria, quindi le tecniche suggerite saranno utili.
Mille grazie per i vostri suggerimenti!
Chris
Bad ipotesi. Aspetta 2 secondi.Quello sarà 2 secondi. tra la fine di uno e l'inizio di un altro. Di solito vuoi 2 sec. tra l'inizio di uno e l'inizio di un altro. –
Bene, attendere 2 secondi tra la fine di uno e l'inizio di un altro può essere più sicuro se i limiti vengono eseguiti in base all'ora effettiva tra le chiamate. Il vero problema è che la soluzione attende più di 2 secondi tra le richieste, poiché il calcolo tra le richieste potrebbe richiedere del tempo. – Brian