我有一个每晚运行的任务,用于从外部系统更新用户。如何防止我的服务器因请求而泛滥外部系统?
我的代码:
@task()
def update_users():
#Get all users
users = User.objects.all()
for userobject in users:
#send to update task:
update_user.apply_async(args=[userobject.username,], countdown=15)
有没有办法“减慢”forloop,或者是否有可能让芹菜不执行任务,如果已经有任务在运行?
答案 0 :(得分:0)
您可以对任务使用锁定,强制它一次只为整个工作池执行一次。您可以查看this celery recipe。
暂时停下来帮助你,因为这些任务有可能同时执行,比如说队列有一些延迟。
答案 1 :(得分:0)
首先,您需要指定“泛滥”服务的具体含义。事实是许多请求最终被解雇并发到一个服务器?如果是这种情况,一个常见的模式就是应用 pool 的工人,其固定大小 N 。使用此方法,可以保证同时使用最多 N个请求查询您的服务。也就是说,在任何时间点,不会有超过N个未完成的请求。这有效地限制了您的请求率。
然后你可以玩N并进行一些基准测试,看看你的具体情况是合理的。
答案 2 :(得分:-1)
1您可以使用time.sleep来延迟任务
import time
@task()
def update_users():
#Get all users
users = User.objects.all()
for userobject in users:
#send to update task:
update_user.apply_async(args=[userobject.username,], countdown=15)
time.sleep(1)
这将延迟for循环1秒