防止 python 使用来自 for 循环的任务淹没服务器
Prevent python flooding server with task from for loop
我有一个每晚运行的任务,从外部系统更新用户。如何防止我的服务器用请求淹没外部系统?
我的代码:
@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)
有什么方法可以 "slow down" forloop,或者如果已经有任务在运行,是否可以让 celery 不执行任务?
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 秒
您可以在您的任务上使用锁,强制它对整个工作池一次只执行一次。您可以查看 this celery recipe.
将 time.sleep 放在对你没有帮助,因为这些任务有可能同时执行,比如队列是否有延迟。
首先,您需要具体说明 "flooding" 服务的确切含义。许多请求最终被 同时 触发到一台服务器是事实吗?如果是这样的话,一个常见的模式实际上是应用 池 工人,固定大小 N。使用这种方法,可以保证您的服务同时被 至多 N 个请求查询。也就是说,在任何时间点,不会有超过 N 个未完成的请求。这有效地限制了您的请求率。
然后您可以使用 N 并进行一些基准测试,看看哪个数字在您的特定情况下是合理的。
我有一个每晚运行的任务,从外部系统更新用户。如何防止我的服务器用请求淹没外部系统?
我的代码:
@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)
有什么方法可以 "slow down" forloop,或者如果已经有任务在运行,是否可以让 celery 不执行任务?
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 秒
您可以在您的任务上使用锁,强制它对整个工作池一次只执行一次。您可以查看 this celery recipe.
将 time.sleep 放在对你没有帮助,因为这些任务有可能同时执行,比如队列是否有延迟。
首先,您需要具体说明 "flooding" 服务的确切含义。许多请求最终被 同时 触发到一台服务器是事实吗?如果是这样的话,一个常见的模式实际上是应用 池 工人,固定大小 N。使用这种方法,可以保证您的服务同时被 至多 N 个请求查询。也就是说,在任何时间点,不会有超过 N 个未完成的请求。这有效地限制了您的请求率。
然后您可以使用 N 并进行一些基准测试,看看哪个数字在您的特定情况下是合理的。