防止带有for循环任务的python flooding服务器

时间:2015-01-06 12:13:14

标签: python celery

我有一个每晚运行的任务,用于从外部系统更新用户。如何防止我的服务器因请求而泛滥外部系统?

我的代码:

@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,或者是否有可能让芹菜不执行任务,如果已经有任务在运行?

3 个答案:

答案 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秒