python自动化开发学习 I/O多路复用
python自动化开发学习 I/O多路复用
一. 简介
socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信。IO多路复用的系统消耗很小。
IO多路复用底层就是监听socket对象内部是否有变化,是否在收发消息,Python中select模块提供了select poll epoll 三种方式来实现IO多路复用,支持不同的操作系统。
windows : 提供select
Mac : 提供select
Linux : 提供select, poll, epoll
(1)select简介:
select 默认会将每一个变化的socket加入一个他自己维护的列表中,但是并不会明确是哪一个socket,它内部其实是通过一个for循环遍历整个列表,当列表中的socket很多的时候,for循环就会浪费资源。select默认可以监听1024个链接,它是由linux在同文件中定义的,可修改。select不是安全的线程,如果你把一个socket加入到select中,突然另外一个线程关闭了这个socket,那么接下来select的行为是随机的。
(2)poll简介:
poll修复了select的一些问题,例如去掉了1024个链接限制,想要监听多少都可以,poll不在修改传入的数组,但是poll依然不是线程安全的。
(3)epoll简介:
epoll不仅会告诉你socket组里面的数据,还会告诉你具体哪个socket有数据,无需自己寻找。而且epoll终于是线程安全的了。然而epoll局限于
Linux操作系统。
二 . 应用
select 方法
1
2
3
4
5
6
7
8
9
10
|
句柄列表 11 , 句柄列表 22 , 句柄列表 33 = select.select(句柄序列 1 , 句柄序列 2 , 句柄序列 3 , 超时时间)<br> 参数: 可接受四个参数(前三个必须) 返回值:三个列表 select方法用来监视文件句柄,如果句柄发生变化,则获取该句柄。 1 、当 参数 1 序列中的句柄发生可读时(accetp和read),则获取发生变化的句柄并添加到 返回值 1 序列中 2 、当 参数 2 序列中含有句柄时,则将该序列中所有的句柄添加到 返回值 2 序列中 3 、当 参数 3 序列中的句柄发生错误时,则将该发生错误的句柄添加到 返回值 3 序列中 4 、当 超时时间 未设置,则select会一直阻塞,直到监听的句柄发生变化 当 超时时间 = 1 时,那么如果监听的句柄均无任何变化,则select会阻塞 1 秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。 |
(1)监听客户端连接
服务端
import socket
import select
sk = socket.socket()
sk.bind(("127.0.0.1", 9999,))
sk.listen(5)
while True:
rlist, w, e = select.select([sk, ], [], [], 5)
# 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为[sk]
# 监听conn对象,如果conn发生变化,表示客户端有消息发送过来了,此时rlist的值为[客户端]
print(rlist)
for r in rlist:
print(r)
conn, address = r.accept()
conn.sendall(bytes("hello", encoding="utf-8"))
服务端
客户端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 9999,))
data = sk.recv(1024)
print(data)
while True:
input(">>")
sk.close()
客户端
(2)监听客户端连接及接受客户端发送的数据
import socket
import select
sk = socket.socket()
sk.bind(("127.0.0.1", 9999,))
sk.listen(5) inputs = [sk,]
while True:
rlist, w, e = select.select(inputs, [], [], 1)
# 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为[sk]
# 监听conn对象,如果conn发生变化,表示客户端有消息发送过来了,此时rlist的值为[客户端]
print(len(inputs), len(rlist))
for r in rlist:
print(r)
if r == sk:
# 有新的客户端连接进来
conn, address = r.accept()
inputs.append(conn)
conn.sendall(bytes("hello", encoding="utf-8"))
else:
# 有客户端给我发送数据
recv_data = r.recv(1024)
print(recv_data)
服务端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 9999,))
data = sk.recv(1024)
print(data)
while True:
inp = input(">>")
sk.sendall(bytes(inp, encoding='utf-8'))
sk.close()
客户端
(3)读写分离
import socket
import select
sk = socket.socket()
sk.bind(("127.0.0.1", 9999,))
sk.listen(5) inputs = [sk,]
outputs = []
while True:
rlist, wlist, e = select.select(inputs, outputs, [], 1)
# 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为[sk]
# 监听conn对象,如果conn发生变化,表示客户端有消息发送过来了,此时rlist的值为[客户端]
print(len(inputs), len(rlist))
for r in rlist:
print(r)
if r == sk:
# 有新的客户端连接进来
conn, address = r.accept()
inputs.append(conn)
conn.sendall(bytes("hello", encoding="utf-8"))
else:
# 有客户端给我发送数据
try:
recv_data = r.recv(1024)
if not recv_data: # 某些操作系统,在socket断开的时候,会发送一个空给server,所以要判断空的情况
raise Exception("断开连接")
else:
outputs.append(r)
except Exception as e:
inputs.remove(r)
for w in wlist:
w.sendall(bytes("response", encoding="utf-8"))
outputs.remove(w)
服务端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 9999,))
data = sk.recv(1024)
print(data)
while True:
inp = input(">>")
sk.sendall(bytes(inp, encoding='utf-8'))
print(sk.recv(1024))
sk.close()
客户端
(4)读写分离之服务端根据客户端的输入返回对应的信息
import socket
import select
sk = socket.socket()
sk.bind(("127.0.0.1", 9999,))
sk.listen(5) inputs = [sk, ] #
outputs = []
messages = {} # 用来存放客户端发送过来的消息,存放格式 连接客户端的对象: 消息
while True:
rlist, wlist, elist = select.select(inputs, outputs, [sk, ], 1)
# rlist 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为[sk]
# wlist 监听conn对象,如果conn发生变化,表示客户端有消息发送过来了,此时rlist的值为[客户端]
# elist 监听sk(服务器端)对象是否发生错误
print(len(inputs), len(rlist))
for r in rlist:
print(r)
if r == sk:
# 有新的客户端连接进来
conn, address = r.accept()
inputs.append(conn)
messages[conn] = [] # 在存储消息的字典中创建一个以客户端连接对象为key 空列表为value的键值对
conn.sendall(bytes("hello", encoding="utf-8"))
else:
# 有客户端给我发送数据
try:
recv_data = r.recv(1024)
if not recv_data: # 某些操作系统,在socket断开的时候,会发送一个空给server,所以要判断空的情况
raise Exception("断开连接")
else:
outputs.append(r)
messages[r].append(recv_data)
except Exception as e:
inputs.remove(r)
del messages[r]
for w in wlist:
print(messages[w])
msg = messages[w].pop()
resp = msg + bytes("response", encoding="utf-8")
w.sendall(resp)
outputs.remove(w)
服务端
python自动化开发学习 I/O多路复用的更多相关文章
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- Python自动化开发学习20-Django的form组件
武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...
- 《Python Web开发学习实录》高清PDF版|百度网盘免费下载|Python Web开发学习实录
<Python Web开发学习实录>高清PDF版|百度网盘免费下载|Python Web开发学习实录 提取码:9w3o 内容简介 Python是目前流行的动态脚本语言之一. 李勇,本书共1 ...
- python web 开发学习路线
转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...
- Selenium2+python自动化(学习笔记3)
1.加载firefox配置 参考代码: # coding=utf-8from selenium import webdriver# 配置文件地址,打开Firefox点右上角设置--帮助--故障排除信息 ...
- Python自动化开发-简介
1.Python简介 Python创始人 Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...
- python自动化开发-1
1.python简介 python是一门简明并且强大的面向对象的开发语言,已经在WEB开发,软件开发,科学计算,大数据分析,自动化运维等领域得到了广泛的应用. 注意:所有测试均已python3为主,与 ...
- 写给深圳首期Python自动化开发周未班的信
你是否做了正确的决定? 深圳首期周未班的同学们大家好,我是Alex, 老男孩教育的联合创始人,Python项目的发起人,51CTO学院连续2届最受学员喜爱的讲师,中国最早一批使用Python的程序员, ...
- python自动化开发-[第九天]-异常处理、进程
今日概要: 1.异常处理使用 2.进程 3.paramiko模块使用 一.异常处理 1.常见的错误异常 #错误异常一 print(a) #NameError #错误异常二 int('sdadsds') ...
随机推荐
- android greendao3.0 多表关联关系讲解(转)
转自:http://www.jianshu.com/p/dbec25bd575f 前言 之前用过数据库框架:realm.kjdb,今天准备实践学习一下greendao 3.0.greendao 3.0 ...
- C++中多态性学习(上)
多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子 ...
- Binding基础 文摘
简要 Binding基础 Binding源与路径 列举Binding的源 Binding基础 从Coding中看Binding的基础. 先定义一个Student类: public class Stud ...
- Linux64位程序移植
1 概述 Linux下的程序大多充当服务器的角色,在这种情况下,随着负载量和功能的增加,服务器所使用内存必然也随之增加,然而32位系统固有的4GB虚拟地址空间限制,在如今已是非常突出的问题了:另一个需 ...
- MongoDBTemplate多条件查询的问题
问题: 在使用Spring Data MongoDB 进行条件查询数据时,发现条件判断不起作用,结果会返回所有的数据. Criteria criteria = new Criteria(); crit ...
- 圆环自带动画进度条ColorfulRingProgressView
这是项目中遇到了,我也是借鉴大神的, 下载地址:https://github.com/oooohuhu/ColorfulRingProgressView 我把它导入了github中了,里面有详细的使用 ...
- MySQL常见问题和命令
问题: 1.centos MySQL启动失败:关闭selinux, vi /etc/selinux/config, 设置SELINUX=disabled,重启电脑: 命令: 停止.启动mysql服务器 ...
- task1-9
今天完成: Task1.参考修真院线下报名贴(学习资料-线下报名-北京报名)中报名的格式,整理出业务模型,确定需要几个对象,每个对象的属性是什么,对象和对象之间的关系是一对一,还是一对多. [参考资料 ...
- 软件测试人员需要精通的开发语言(1)--- VBScript
软件测试不局限于点点点的纯黑盒测试,提升自身的代码能力也是事关重要的.软件测试的发展,越来越多的公司对于测试人员的要求也日益提高,测试人员必备开发能力的优势也凸显出来.简单的介绍下部分开发语言的学习及 ...
- Earth Hour(最短路)
Earth Hour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...