防止 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 并进行一些基准测试,看看哪个数字在您的特定情况下是合理的。