【问题标题】:Configuration to perform only 30 tasks per minute using python-rq使用 python-rq 配置为每分钟仅执行 30 个任务
【发布时间】:2016-08-10 11:37:18
【问题描述】:

我正在构建一个分布式爬取机制,并希望确保一分钟内向服务器发出的请求不超过 30 个。每个入队的任务都会发出一个请求。

所有任务都在redis中入队,并使用python-rq提供的api进行出队。

方法是在redis中设置一个每分钟过期的key,用来保存发送的请求数。

每次有工作可用时,检查请求是否发送


以下是我的自定义工作者:

#!/usr/bin/env python
import sys
import time
from rq import Connection, Worker
from redis import Redis

redis = Redis()

def should_i_work():
    r = redis.get('app:requests_sent_in_last_minute')
    if r == None:
        redis.setex('app:requests_sent_in_last_minute', 1, 60)
    return  r == None or int(r) < 30

def increment_requests():
    r = int(redis.get('app:requests_sent_in_last_minute'))
    redis.set('app:requests_sent_in_last_minute', r+1)

def main(qs):
    with Connection():
        try:
            while True:
                if should_i_work():
                    increment_requests()
                    w = Worker(qs)
                    w.work()
                else:
                    time.sleep(60)
        except KeyboardInterrupt:
            pass

if __name__ == '__main__':
    qs = sys.argv[1:] or ['default']
    main(qs)

这似乎不起作用,因为尽管数字以通常的速度执行任务,而且设置的键的值不会更新超过 3,但工作人员执行任务。

我有一种强烈的感觉,我的思维过程有缺陷。我在这里做错了什么?

谢谢

【问题讨论】:

    标签: python python-rq


    【解决方案1】:

    查看worker.py 来源后,我的思维过程中的错误很明显。 w.work() 函数启动一个循环并不断地使任务出队。

    因为这个过程是无法控制的,所以不重写worker类,下一个最好的办法就是控制入队过程。如果在最后一分钟添加了超过 30 个任务,则不要排队。

    这是我想出的解决方案:https://gist.github.com/shivekkhurana/7201e5cd2ec9d51af31c8b96eeb8fcf7

    只需在-w 标志中传递RequestAwareWorker

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2018-12-24
      • 2010-10-19
      相关资源
      最近更新 更多