Python——redis发布者/订阅者笔记

先介绍一下redis的pub/sub功能:

Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。

通俗来讲,就是说我sub端(订阅者)一直监听着,一旦pub端(发布者)发布了消息,那么我就接收过来,举个小栗子,先是发布者:

#coding:utf-8
import time
import redis,MySQLdb

db = MySQLdb.connect(***************)
db.set_character_set('utf8')
cursor = db.cursor()
vid_list = [i[0] for i in cursor.fetchmany(cursor.execute('**********'))]
db.close()
rc = redis.StrictRedis(host='***',port='***',db=3,password='********')
ls_len = len(vid_list)
index = ls_len/2
vid_foo_list = vid_list[0:index]	#这是把list列表分成2部分给bar和foo
vid_bar_list = vid_list[index:]
for vid in vid_foo_list:
    rc.publish("foo", vid)  #发布消息到foo

for vid in vid_bar_list:
    rc.publish("bar", vid)

接着我们来看看订阅者:

#coding:utf-8
import time
import redis

rc = redis.StrictRedis(host='****',port='******',db=3,password='******')
ps = rc.pubsub()
ps.subscribe(['foo','bar'])  #从foo,bar 订阅消息
for item in ps.listen():		#监听状态:有消息发布了就拿过来
    if item['type'] == 'message':
        print item['channel']
        print item['data']

关于数据结构,也就是item,是类似于:{'pattern': None, 'type': 'message', 'channel': 'bar', 'data': '26418491'}这样的,所以可以通过channel来判断这个消息是属于哪一个队列里的。(运行程序的时候,先运行订阅者,在运行发布者程序)


那么这有什么用呢——做爬虫之类的简单分布式:我们可以把我们要采集的url的list列表放在发布者程序里面,爬虫采集程序放在订阅者里,这样,就能实现了一个简单的分布式爬虫


猜你喜欢

转载自blog.csdn.net/topkipa/article/details/77336069