我正在使用Celery来处理多个数据挖掘任务。其中一项任务连接到远程服务,该服务允许最多10个同时连接每个用户(换句话说, CAN 全局超过10个连接,但不能每个工作超过10个连接。
我认为 Token Bucket (rate limiting)正是我正在寻找的,但我似乎无法找到它的任何实现。
答案 0 :(得分:10)
Celery具有速率限制功能,并包含通用令牌桶实现。
设定任务的费率限制: http://docs.celeryproject.org/en/latest/userguide/tasks.html#Task.rate_limit
或在运行时:
http://docs.celeryproject.org/en/latest/userguide/workers.html#rate-limits
令牌桶实现在Kombu
答案 1 :(得分:3)
经过大量研究后我发现Celery没有明确提供一种方法来限制像这样的并发实例的数量,而且这样做通常被认为是不好的做法。
更好的解决方案是在单个任务中同时下载,并使用Redis或Memcached存储和分发其他任务来处理。
答案 2 :(得分:3)
虽然这可能是不好的做法,但您可以使用专用队列并限制工作人员,例如:
# ./manage.py celery worker -Q another_queue -c 10