2015-04-24 4 views
6

я ищу способ ограничить, когда функция вызывается, но только тогда, когда входные параметры различны, то есть:сельдерей: ограничение скорости задач с теми же параметрами

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

Так что я хотел бы api_call("antoine") будет называться 60 раз в секунду и api_call("oscar")60 раз в секунду также.

Любая помощь в том, как я могу это сделать?

--EDIT 27/04/2015 Я попытался вызвать подзадачу с переменной rate_limit внутри задачи, но она тоже не работает: Rate_limit всегда применяется для всех созданных подзадач или задач (что логично).

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

Лучшее!

+1

Не можете просто использовать @ app.task (rate_limit = 60) декоратор по методу? – reptilicus

+0

Ну, я так не думаю, так как это ограничит как api_call («antoine»), так и api_call («Oscar») @ 30/s, и я хочу, чтобы ограничение применялось для каждого параметра, а не для каждой функции. – antoinet

+0

Коррекция, я хочу, чтобы ограничение применялось не только для каждой функции, но и для каждого параметра. – antoinet

ответ

0

Я не думаю, что этого можно достичь с помощью встроенного ограничителя задач компании Celery.

Предполагая, что вы используете какой-то кеш для своего API, лучшим решением может быть создание хэша имени задачи и аргументов и использование этого ключа для дросселя на основе кеша.

Если вы используете Redis, вы можете установить блокировку с 60-секундным таймаутом или использовать инкрементный счетчик для подсчета вызовов в минуту.

Это сообщение может дать вам некоторые указатели на распределенном дросселированием задач Сельдерея с Redis:

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

+0

Благодарим вас за ваш ответ и предложение. До сих пор я использовал RabbitMQ с Celery, но я, вероятно, продолжу использовать свой старый добрый код! – antoinet

 Смежные вопросы

  • Нет связанных вопросов^_^