0709自我总结

select模块

一.介绍

Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统)

二.select方法

r_list,w_list,e_list = select.select(rlist, wlist, xlist, [timeout])

三个参数

  • rlist

    • wait until ready for reading(等待,直到准备阅读)
    • 在tcp协议中accept与recv都存在一个等待的过程他们要等数据过来才会执行消息发来后他会进入一个可读状态
  • wlist

    • wait until ready for writing(等待,直到准备写)
    • 在tcp协议send不存在一个等待的过程,他会直接把信息丢到缓存,然后这时候会进入可写状态
  • xlist

    • wait for an “exceptional condition”(等待,有异常情况)
  • timeout

    • 当超时时间为空,则select会一直阻塞,直到监听的句柄发生变化
    • 当超时时间 = n(正整数)时,那么如果监听的句柄均无任何变化,则select会阻塞n秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。

示例:

服务端

import socket
import time
import select
s = socket.socket()
s.bind(("127.0.0.1",1688))
# 设置为非阻塞 模型
s.setblocking(True) #在多路复用中 阻塞与非阻塞没有区别 因为select会阻塞直到有数据到达为止
s.listen(5)
# 待检测是否可读的列表
r_list = [s]
# 待检测是否可写的列表
w_list = []
# 待发送的数据
msgs = {}
print("开始检测了")
while True:
read_ables, write_ables, _= select.select(r_list,w_list,[])
print("检测出结果了!")
# print(read_ables,"可以收数据了")
# print(write_ables,"可以发数据了")
# 处理可读 也就是接收数据的
for obj in read_ables: # 拿出所有可以读数据的socket
#有可能是服务器 有可能是客户端
if s == obj: # 服务器
print("来了一个客户端 要连接")
client,addr = s.accept()
r_list.append(client) # 新的客户端也交给select检测了
else:# 如果是客户端则执行recv 接收数据
print("客户端发来一个数据")
data = obj.recv(1024)
print("有个客户端说:",data)
# 将要发送数据的socket加入到列表中让select检测
w_list.append(obj)
# 将要发送的数据已经socket对象丢到容器中
if obj in msgs: # 由于容器是一个列表 所以需要先判断是否已经存在了列表
msgs[obj].append(data)
else:
msgs[obj] = [data]
# 处理可写的 也就是send发送数据
for obj in write_ables:
msg_list = msgs.get(obj)
if msg_list:
# 遍历发送所有数据
for m in msg_list:
obj.send(m.upper())
# 数据从容器中删除
msgs.pop(obj) # 将这个socket从w_list中删除
w_list.remove(obj)

客户端

import socket
c = socket.socket()
c.connect(("127.0.0.1",1688)) while True:
msg = input("").strip()
if not msg:continue
c.send(msg.encode("utf-8"))
print(c.recv(1024).decode('utf-8'))

后续几种方法以后总结补充

select模块(I/O多路复用)的更多相关文章

  1. Python之基于socket和select模块实现IO多路复用

    '''IO指的是输入输出,一部分指的是文件操作,还有一部分网络传输操作,例如soekct就是其中之一:多路复用指的是利用一种机制,同时使用多个IO,例如同时监听多个文件句柄(socket对象一旦传送或 ...

  2. 第五十五节,IO多路复用select模块加socket模块,伪多线并发

    IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...

  3. python学习之-- IO多路复用 select模块

    python I/O多路复用包括3个模块,上一篇已经说过概念,这里我使用的是select模块实现一个ftp并发 服务器端核心代码: import socket,select import queue, ...

  4. Python——IO多路复用之select模块epoll方法

    Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_c ...

  5. Python——IO多路复用之select模块poll方法

    Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...

  6. Python——IO多路复用之select模块select方法

    Python——IO多路复用之select模块select方法 使用select模块的select方法实现Python——IO多路复用 实现同时将终端输入的文本以及客户端传输的文本写入文本文件中: w ...

  7. python中的select模块

    介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...

  8. Python自动化开发 - select模块

    介绍: IO-多路复用:监听多个socker对象是否有变化,包括可读.可写.发送错误 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个 ...

  9. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...

随机推荐

  1. MySQL学习-SQL约束

    约束分类 主键:PRIMARY KEY用于唯一标识表中的一行,不可重复.e.g.:id INT(10) PRIMARY KEY 默认值:DEFAULT插入时,若没有指定该列的值,则为DEFAULT指定 ...

  2. VM中linux和windows主机进行串口通信

    最近在做关于AIS的内容.为了对AIS电文进行解码,串口收发. 数据有PC机模拟发送,为了调试方便,不用次次将程序放到开发板上运行,所以利用pc主机和虚拟机进行串口通信模拟该过程. 首先需要用到一个软 ...

  3. ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件

    1.ViewPager在处理滑动事件的时候要用到OnPageChangeListener( 代码:this.viewPager.setOnPageChangeListener(new MyListen ...

  4. Django预备知识

    http协议 url: 协议://域名(IP)+端口(80)/路径?参数(a=1&b=2) 示例:https://www.baidu.com/s/?wd=aaa MVC M:mdoel 与数据 ...

  5. 【转载】Chrome使用自定义协议打开本地程序并运行IE打开网页

    部分内容转载自: http://blog.sina.com.cn/s/blog_e2b8213a0102wqby.html 项目中遇到某需求:chorme要运行IE并打开网页.解决方案之一就是通过自定 ...

  6. 【转】解决Nginx php-fpm配置有误引起的502错误

    转自:https://www.centos.bz/2017/07/nginx-php-fpm-502-error/ 在Ubuntu+Nginx+PHP环境下部署好以后,访问网站报错502,在后台ngi ...

  7. web页面加载速度缓慢,如何优化?

    参考博客: https://www.cnblogs.com/xp796/p/5236945.html https://www.cnblogs.com/MarcoHan/p/5295398.html - ...

  8. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  9. Python 爬虫从入门到进阶之路(十五)

    之前的文章我们介绍了一下 Python 的 json 模块,本章我们就介绍一下之前根据 Xpath 模块做的爬取<糗事百科>的糗事进行丰富和完善. 在 Xpath 模块的爬取糗百的案例中我 ...

  10. css实现超出文本溢出用省略号代替

    一.单行 实现单行文本的溢出显示省略号使用text-overflow:ellipsis属性,但需要配合使用另外两个属性使用才能达到效果. 如下: overflow:hidden; text-overf ...