Web开发

首页 » 常识 » 预防 » python进阶教程web服务器epo
TUhjnbcbe - 2023/3/3 18:46:00
北京哪家医院皮肤科 http://m.39.net/pf/a_4781492.html

epoll版-TCP服务器

1.epoll的优点:

没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于

效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。

2.epoll使用参考代码

importsocket

importselect

#创建套接字

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#设置可以重复使用绑定的信息

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

#绑定本机信息

s.bind((,))

#变为被动

s.listen(10)

#创建一个epoll对象

epoll=select.epoll()

#测试,用来打印套接字对应的文件描述符

#prints.fileno()

#printselect.EPOLLIN

select.EPOLLET

#注册事件到epoll中

#epoll.register(fd[,eventmask])

#注意,如果fd已经注册过,则会发生异常

#将创建的套接字添加到epoll的事件监听中

epoll.register(s.fileno(),select.EPOLLIN

select.EPOLLET)

connections={}

addresses={}

#循环等待客户端的到来或者对方发送数据

whileTrue:

#epoll进行fd扫描的地方--未指定超时时间则为阻塞等待

epoll_list=epoll.poll()

#对事件进行判断

forfd,eventsinepoll_list:

#printfd

#printevents

#如果是socket创建的套接字被激活

iffd==s.fileno():

conn,addr=s.accept()

print(有新的客户端到来%s%str(addr))

#将conn和addr信息分别保存起来

connections[conn.fileno()]=conn

addresses[conn.fileno()]=addr

#向epoll中注册连接socket的可读事件

epoll.register(conn.fileno(),select.EPOLLIN

select.EPOLLET)

elifevents==select.EPOLLIN:

#从激活fd上接收

recvData=connections[fd].recv()

iflen(recvData)0:

print(recv:%s%recvData)

else:

#从epoll中移除该连接fd

epoll.unregister(fd)

#server侧主动关闭该连接fd

connections[fd].close()

print(%s---offline---%str(addresses[fd]))

2.说明

EPOLLIN(可读)

EPOLLOUT(可写)

EPOLLET(ET模式)

epoll对文件描述符的操作有两种模式:LT(leveltrigger)和ET(edgetrigger)。LT模式是默认模式,LT模式与ET模式的区别如下:

LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。

ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。

1
查看完整版本: python进阶教程web服务器epo