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

本文介绍如何利用Redis的发布与订阅(Pub/Sub)功能实现一个简易的分布式爬虫系统。通过将待抓取的URL列表分为两部分,并分别由两个不同的频道进行发布,再由订阅者接收并处理这些URL,展示了Pub/Sub机制在实际场景中的应用。
部署运行你感兴趣的模型镜像

先介绍一下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列表放在发布者程序里面,爬虫采集程序放在订阅者里,这样,就能实现了一个简单的分布式爬虫


您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值