并发网络通信-io多路复用

Posted chenlulu1122

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发网络通信-io多路复用相关的知识,希望对你有一定的参考价值。

"""
io多路复用 select
select tcp 服务
"""
from socket import *
from select import *


s = socket()# 创建套接字,监听连接
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
s.bind((‘0.0.0.0‘, 9999))
s.listen(5)
rlist = [s]

while True:
try:
rs, ws, xs = select(rlist,[], [])
except:
continue
for i in rs:
if i == s:
c, addr = i.accept()
rlist.append(c)
else:
data = i.recv(1024).decode()
if not data:
rlist.remove(i)
i.close()
else:
print(data)
i.send(b‘thanks‘)

 


"""
io多路复用的实现 poll()

"""

from select import *
from socket import *


s = socket()# 创建套接字 io
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
s.bind((‘0.0.0.0‘, 8888))
s.listen(5)

print(‘监控io‘)


fdmap = {s.fileno(): s}# 键值对保持文件描述符和io


p = poll()# 创建poll对象


p.register(s, POLLIN)# 关注io事件


while True:
events = p.poll()# 监控io事件,返回就绪io事件列表,内部元素是(io事件文件符,类型)构成的元组
for fd, event in events:
if fdmap[fd] == s:
c, addr = fdmap[fd].accept()
p.register(c, POLLIN | POLLERR)
fdmap[c.fileno()] = c
elif event & POLLIN:
data = fdmap[fd].recv(1024).decode()
if not data:
p.unregister(fd)
del fdmap[fd]
else:
print(data)
fdmap[fd].send(b‘ok‘)

 

以上是关于并发网络通信-io多路复用的主要内容,如果未能解决你的问题,请参考以下文章

7-4 并发编程IO多路复用常见考题

python使用select和epoll实现IO多路复用实现并发服务器

IO模型以及多路复用基本原理

第15章 高并发服务器编程_I/O多路复用

python并发编程-多路复用IO

python中的IO多路复用