socket的epoll模型怎么使用
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"socket的epoll模型怎么使用",在日常操作中,相信很多人在socket的epoll模型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"s
千家信息网最后更新 2026年11月02日socket的epoll模型怎么使用
这篇文章主要介绍"socket的epoll模型怎么使用",在日常操作中,相信很多人在socket的epoll模型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"socket的epoll模型怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
select模型虽好,却有一个缺陷,只能对1024个文件描述符进行监视,虽然可以通过重新编译内核获得更大的监视数量,但这样做还不如将目光投向更高级的epoll模型。select模型中,每一次都需要遍历所有处于监视中的文件描述符,判断他们哪个可写,哪个可读,这样一来,你监视的越多,速度越慢,而在epoll模型中,所有添加到epoll中的事件都会网卡驱动程序建立起回调关系,简言之,如果有一个连接可写,那么这个可写的事件就会报告给你,而你不需要挨个询问他们哪个连接可写,哪个连接可读。
下面的示例,所实现的功能,和之前的示例一样,但更加高效:
#coding=utf-8
import socket
import select
import sys
from MsgContainer import MsgContainer
def start_server(port):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', port))
#accept队列大小为100
serversocket.listen(100)
serversocket.setblocking(0)
epoll = select.epoll()
#注册一个in事件,等待有数据可读
epoll.register(serversocket.fileno(), select.EPOLLIN)
try:
#保存连接,请求,和响应信息
connections = {};
message_queues = {} #存储可发送的数据
while True:
#最多等待1秒钟时间,有事件返回事件列表
events = epoll.poll(1)
for fileno, event in events:
#事件的句柄是server
if fileno == serversocket.fileno():
connection, address = serversocket.accept()
#设置为非阻塞的
connection.setblocking(0)
#新建的连接也注册读事件
epoll.register(connection.fileno(), select.EPOLLIN)
connections[connection.fileno()] = connection
message_queues[connection.fileno()] = MsgContainer()
#不是server,那就是建立的连接,现在连接可读
elif event & select.EPOLLIN:
data = connections[fileno].recv(1024)
if data :
epoll.modify(fileno, select.EPOLLOUT)
message_queues[fileno].add_data(data)
else:
epoll.modify(fileno, 0)
connections[fileno].shutdown(socket.SHUT_RDWR)
del connections[fileno]
del message_queues[fileno]
elif event & select.EPOLLOUT:
#可写的事件被触发
if not fileno in message_queues or not fileno in connections:
continue
clientsocket = connections[fileno]
mc = message_queues[fileno]
msgs = mc.get_all_msg()
for msg in msgs:
msg = mc.pack_msg(msg)
clientsocket.send(msg)
mc.clear_msg()
#需要回写的数据已经写完了,再次注册读事件
epoll.modify(fileno, select.EPOLLIN)
elif event & select.EPOLLHUP:
#被挂起了,注销句柄,关闭连接,这时候,是客户端主动断开了连接
epoll.unregister(fileno)
if fileno in connections:
connections[fileno].close()
del connections[fileno]
if fileno in message_queues:
del message_queues[fileno]
finally:
epoll.unregister(serversocket.fileno())
epoll.close()
serversocket.close()
if __name__ == '__main__':
if len(sys.argv) == 2:
port = int(sys.argv[1])
start_server(port)
else:
print u'请输入端口号'下面看client端的代码:
#coding=utf-8
import sys
import time
import datetime
import socket
import cPickle
import threading
from MsgContainer import MsgContainer
def start_client(addr,port,msgCount):
mc = MsgContainer()
PLC_ADDR = addr
PLC_PORT = port
time_lst = []
s = socket.socket()
s.connect((PLC_ADDR, PLC_PORT))
seconds1 = int(time.time())
i = 0
while True:
seconds = int(time.time())
microseconds = datetime.datetime.now().microsecond
data = {'sec':seconds,'micsec':microseconds}
data = cPickle.dumps(data)
data = mc.pack_msg(data)
s.send(data)
recv_data = s.recv(1024)
mc.add_data(recv_data)
msgs = mc.get_all_msg()
seconds = int(time.time())
microseconds = datetime.datetime.now().microsecond
for msg in msgs:
msgdict = cPickle.loads(msg)
time_lst.append(((seconds-msgdict['sec'])*1000000 + microseconds-msgdict['micsec'])/1000.0)
mc.clear_msg()
i += 1
if i>msgCount:
print sum(time_lst)/float(len(time_lst))
break
s.close()
if __name__ == '__main__':
if len(sys.argv) == 4:
addr = sys.argv[1]
port = int(sys.argv[2])
msgCount = int(sys.argv[3])
t_lst = []
for i in range(100):
t = threading.Thread(target=start_client,args=(addr,port,msgCount))
t_lst.append(t)
for t in t_lst:
t.start()
for t in t_lst:
t.join()
#start_client('123.56.190.151',8091,100在客户端,每次起100个线程尝试建立连接,如果server端的accept队列大小设置的小,例如设置为10,就会出现个别连接无法建立的情况,所以我这里设置为100。
到此,关于"socket的epoll模型怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
事件
模型
学习
监视
数据
句柄
大小
客户
客户端
文件
更多
示例
端的
队列
帮助
高级
主动
接下来
简言之
这样一来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网核心科技是什么
互联网的科技创新
致骋互联网科技
菲比寻常互联网科技
顺玮阁互联网科技
狮子座互联网科技培训
互联网科技宣传片
卓越科技互联网 招聘
滨湖区互联网智能科技产品供应
互联网科技公司的市场部门
云创客互联网科技公司
中化能源互联网科技招聘
港股科技和互联网
速维有品互联网信息科技(苏州)有限公司
健康食品互联网创新科技园项目
黑科技 体验场景 互联网大会
安徽零酒互联网科技有限公司
互联网科技对化妆品行业
瑞安市蟠桃会互联网科技有限公司
互联网科技创新方面的资料
圆梦互联网科技
期待互联网科技
玖二柒互联网科技公司待遇
互联网科技实习生岗位职责
昊天互联网科技有限公司
阿里互联网科技企业
领航科技大厦互联网公司
富国互联网科技002692
新氧科技和美国互联网有关系吗
宁波跨境商互联网科技有限公司