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. 高启全:长江存储自主3D NAND,DRAM研发欢迎美光一起加入(千秋大业,慢慢做)

    台湾DRAM教父高启全转战大陆紫光集团操盘存储器大计划超过1年,日前晋升长江存储的执行董事.代行董事长,接受DIGITIMES独家专访公开未来规划:他指出,已齐聚500名研发人员在武汉投入3D NAN ...

  2. Linux kernel version dirty

    在我们使用git来管理Linux Kernel的时候,在编译的时候会在你的kernel version加上git commit number 有时候还会出现dirty字样,字面意思是内核被污染的意思. ...

  3. jQuery实时聊天jquery-chat

    jquery-chat是基于jQuery UI + Node.js + Socket.IO 实现100%纯JavaScript实时聊天(客户端和服务器都是JS),实现了facebook / Gmail ...

  4. 程序跳过UAC研究及实现思路(两种方法,现在可能都不行了)

    网上很对跳过UAC资料都是说如果让UAC弹出窗体,并没有真正跳过弹窗,这里结合动态提权+计划任务实现真正意义上的跳过UAC弹窗,运行程序的时候可以不出现UAC窗体,并且程序还是以高权限运行. vist ...

  5. ASP.NET 5 (vNext) 牛刀小試:自帶 DI 容器

    小引 在 ASP.NET 5(vNext)之前,亦即 MVC 4/5.Web API 2 的时代,MVC 与 Web API 框架彼此有非常相似的设计,却是以不同的代码来实现.现在,ASP.NET 5 ...

  6. [迟到的万圣节向]可怕的python

    什么?python简单易懂好学可读性高灵活耐用扩展好? 预测下面几个小段落的输出,来看看这个能过几关? ============================ Stage 1 预测下列输出 def ...

  7. 条款10:令operator= 返回一个reference to *this

    关于赋值,可以写成连锁形式: int x, y, z; x = y = z = 15; //赋值连锁形式 赋值采用右结合律,故上述赋值被解析为: x = (y = (z = 15)); 为了实现连锁赋 ...

  8. spring boot自定义配置文件

    把一些可能会经常变动的东西写在配置文件中,可以增加程序的灵活性,避免多次改版发版. 在sping boot中除了自带的默认配置文件application.properties之外,我们还可以在reso ...

  9. Spring Boot:整合JdbcTemplate

    综合概述 Spring对数据库的操作在jdbc上面做了更深层次的封装,而JdbcTemplate便是Spring提供的一个操作数据库的便捷工具.我们可以借助JdbcTemplate来执行所有数据库操作 ...

  10. PATA 1011 World Cup Betting (20)

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...