python epoll简单模型(协程的实现方式)

EPOLLIN (可读)
EPOLLOUT (可写)
EPOLLET (ET模式)
epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,
LT模式与ET模式的区别如下:
LT模式:当epoll检测到描述符事件发⽣并将此事件通知应⽤程序,应⽤程序可以不⽴即处理该事件。下次调⽤e
poll时,会再次响应应⽤程序并通知此事件。
ET模式:当epoll检测到描述符事件发⽣并将此事件通知应⽤程序,应⽤程序必须⽴即处理该事件。如果不处理
,下次调⽤epoll时,不会再次响应应⽤程序并通知此事件。
LT类似于故障不除,红灯不灭,
ET类似于只说⼀次,不再赘述。
文件描述符
在UNIX/LINUX中,一切皆文件

import socket
import select
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置可以重复使⽤绑定的信息
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
# 绑定本机信息
s.bind(("",7788))
# 变为被动
s.listen(10)
# 将套接字设置为⾮阻塞模式
s.setblocking(False)
# 创建⼀个epoll对象
epoll = select.epoll()
# 测试,⽤来打印套接字对应的⽂件描述符
# print(s.fileno())
# print(select.EPOLLIN|select.EPOLLET)
# 注册事件到epoll中
# epoll.register(fd[, eventmask])
# 注意,如果fd已经注册过,则会发⽣异常
# 将创建的套接字添加到epoll的事件监听中
epoll.register(s.fileno(), select.EPOLLIN|select.EPOLLET)
connections = {}
addresses = {}
# 循环等待客⼾端的到来或者对⽅发送数据
while True:
	# epoll 进⾏ fd 扫描的地⽅ -- 未指定超时时间则为阻塞等待
	epoll_list = epoll.poll()
	# 对事件进⾏判断
	for fd, events in epoll_list:
		# print fd
		# print events
		# 如果是socket创建的套接字被激活
		if fd == s.fileno():
			new_socket, new_addr = s.accept()
			print('有新的客⼾端到来%s' % str(new_addr))
			# 将 conn 和 addr 信息分别保存起来
			connections[new_socket.fileno()] = new_socket
			addresses[new_socket.fileno()] = new_addr
			# 向 epoll 中注册 新socket 的 可读 事件
			epoll.register(new_socket.fileno(), select.EPOLLIN|select.EPOLLET)
			# 如果是客⼾端发送数据
		elif events == select.EPOLLIN:
			# 从激活 fd 上接收
			recvData = connections[fd].recv(1024).decode("utf-8")
			if recvData:
			print('recv:%s' % recvData)
		else:
			# 从 epoll 中移除该 连接 fd
			epoll.unregister(fd)
			# server 侧主动关闭该 连接 fd
			connections[fd].close()
			print("%s---offline---" % str(addresses[fd]))
			del connections[fd]
			del addresses[fd]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值