2015-04-24 36 views
6

Cerco un modo per limitare quando viene chiamata una funzione, ma solo quando i parametri di input sono diversi, vale a dire:Sedano: limite di velocità sulle attività con gli stessi parametri

@app.task(rate_limit="60/s") 
def api_call(user): 
    do_the_api_call() 

for i in range(0,100): 
    api_call("antoine") 
    api_call("oscar") 

quindi vorrei api_call("antoine") da chiamare 60 volte al secondo e api_call("oscar")60 volte al secondo.

Qualsiasi aiuto su come posso farlo?

--edit 27/04/2015 Ho provato a chiamare un'attività secondaria con rate_limit all'interno di un compito, ma non funziona nemmeno: Il rate_limit viene sempre applicata per tutte le attività secondarie o attività istanziati (che è logico).

@app.task(rate_limit="60/s") 
def sub_api_call(user): 
    do_the_api_call() 

@app.task 
def api_call(user): 
    sub_api_call(user) 

for i in range(0,100): 
    api_call("antoine") 
    api_call("oscar") 

Il migliore!

+1

non può semplicemente utilizzare @ app.task (rate_limit = 60) decoratore sul metodo? – reptilicus

+0

Beh, io non la penso così dato che limiterà sia api_call ("antoine") che api_call ("Oscar") @ 30/s, e voglio che la restrizione sia applicata per parametro e non per funzione. Correzione – antoinet

+0

, voglio che la restrizione sia applicata non solo per funzione ma anche per parametro. – antoinet

risposta

0

Non penso che questo sia possibile ottenere con il limitatore di attività incorporato di Celery.

Supponendo che si stia utilizzando una sorta di cache per la propria API, la soluzione migliore potrebbe essere quella di creare un hash del nome dell'attività e degli argomenti e utilizzare tale chiave per un throttler basato sulla cache.

Se si utilizza Redis, è possibile impostare un blocco con un timeout di 60 secondi oppure utilizzare un contatore incrementale per contare le chiamate al minuto.

Questo post potrebbe dare alcune indicazioni su strozzamento distribuita di compiti sedano con Redis:

https://callhub.io/blog/2014/02/03/distributed-rate-limiting-with-redis-and-celery/

+0

Grazie per la risposta e il suggerimento. Finora, ho usato RabbitMQ con Celery, ma probabilmente continuerò a usare il mio buon vecchio codice allora! – antoinet