2015-04-24 28 views
6

aynı parametrelerle görevlerde Oranı limiti, fakat sadece giriş parametreleri farklı olduğunda, yani:Kereviz: Bir işlev çağrıldığında kısıtlamak için bir yol arıyorum

@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") 

yüzden istiyorum api_call("antoine") hem de ikinci başına 60 kez ve ikinci başına api_call("oscar")60 kez çağrılacak.

Bunu yapabilirim nasıl Herhangi bir yardım?

--EDIT 27/04/2015 Bir görev içinde rate_limit ile bir alt görevi çağırmayı denedim, ancak şu ya çalışmıyor: Rate_limit her zaman, tüm örneklenen alt görevler ya da görevler için geçerlidir (mantıksal olan).

@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") 

Best!

+1

sadece app.task @ yöntemine (rate_limit = 60) dekoratör kullanamaz mıyız? – reptilicus

+0

Peki sanırım her ikisi de api_call ("antoine") ve api_call ("Oscar") @ 30/s'yi kısıtlayacağından ve sınırlamanın parametreye göre ve işlev başına uygulanmasını istiyorum. – antoinet

+0

Düzeltme, kısıtlamanın yalnızca işlev başına değil, her parametre için de uygulanmasını istiyorum. – antoinet

cevap

0

Bu kereviz yerleşik görev sınırlandırıcılı elde etmek mümkün olduğunu düşünmüyorum.

API'nız için bir çeşit önbellek kullandığınızı varsayarak, en iyi çözüm, görev adının ve dağıtım kodlarının bir özetini oluşturmak ve bu anahtarı önbellek tabanlı bir kısayol için kullanmak olabilir. Eğer REDIS kullanıyorsanız

, bir 60 saniyelik zaman aşımı ile bir kilit ayarlayabilir veya dakikada çağrıları saymak için artan bir sayaç kullanabilirsiniz ya.

Bu mesaj REDIS ile Kereviz görevleri dağıtılmış daraltma yönelik bazı öneriler size verebilir:

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

+0

Cevabınız ve öneriniz için teşekkür ederiz. Şimdiye kadar, ben Kereviz ile RabbitMQ kullanıyorum, ama muhtemelen eski eski kodumu kullanmaya devam edeceğim o zaman! – antoinet