为了构建分布式爬虫,使用高效的REDIS数据库构建队列,
统一采用先进先出模式。
因为内存数据库是临时保存的(关机或重启数据就会释放),且不能将分配的内存占满,占满后无法进行操作,因此应该适当根据分配的内存控制队列长度。
import redis
from .model import PageProjectList, Session
class Queue(object):
def __init__(self, queue_type):
'''
:param queue_type: 指定队列的种类,
目前主要有project_json,building_json,room_json,roomid四种,
消息队列统一采用先进先出的模式进行管理
'''
self.type = queue_type
self.conn_pool = redis.ConnectionPool(host='10.73.9.21',
port='6379',
password='',
decode_responses=True,
db='1')
self.re_pool = redis.Redis(connection_pool=self.conn_pool)
# 构建连接池
def fidPut(self, value):
'''
:param roomid_value: 待放入redis队列的roomid值
:return: 放入redis队列
'''
self.re_pool.rpush(self.type, value)
def fidGetStr(self):
value = self.re_pool.blpop(self.type)[1]
print("取出的roomid值为" + value)
return value
def qsize_int(self):
'''
:return: 返回队列的大小,整型
'''
return self.re_pool.llen(self.type)
if __name__ == '__main__':
q = Queue("page_list")
while q.qsize_int() < 500:
r = Session.query(PageProjectList).filter(PageProjectList.STATE == 0).first()
q.fidPut(r.FID)
r.STATE = 8
Session.commit()