爲了構建分佈式爬蟲,使用高效的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()