【发布时间】: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,但工作人员执行任务。
我有一种强烈的感觉,我的思维过程有缺陷。我在这里做错了什么?
谢谢
【问题讨论】: