python poll_python--第十天总结(Select/Poll/Epoll使用 )

#!/usr/bin/python

#-*- coding: utf-8 -*-import socket

importselectimport Queue

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

server.setblocking(False)

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

server_address= ("192.168.1.5", 8080)

server.bind(server_address)

server.listen(5)

print"服务器启动成功,监听IP:", server_address

message_queues={}

#超时,毫秒

timeout= 5000#监听哪些事件

READ_ONLY= ( select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR)

READ_WRITE= (READ_ONLY|select.POLLOUT)

#新建轮询事件对象

poller= select.poll()

#注册本机监听socket到等待可读事件事件集合

poller.register(server,READ_ONLY)

#文件描述符到socket映射

fd_to_socket={server.fileno():server,}whileTrue:

print"等待活动连接......"#轮询注册的事件集合

events=poller.poll(timeout)ifnot events:

print"poll超时,无活动连接,重新poll......"

continueprint"有" , len(events), "个新事件,开始处理......"

for fd ,flag inevents:

s=fd_to_socket[fd]

#可读事件if flag & (select.POLLIN | select.POLLPRI) :if s isserver :

#如果socket是监听的server代表有新连接

connection , client_address=s.accept()

print"新连接:", client_address

connection.setblocking(False)

fd_to_socket[connection.fileno()]=connection

#加入到等待读事件集合

poller.register(connection,READ_ONLY)

message_queues[connection]=Queue.Queue()else:

#接收客户端发送的数据

data= s.recv(1024)ifdata:

print"收到数据:" , data , "客户端:", s.getpeername()

message_queues[s].put(data)

#修改读取到消息的连接到等待写事件集合

poller.modify(s,READ_WRITE)else:

# Close the connection

print"closing", s.getpeername()

# Stop listeningforinput on the connection

poller.unregister(s)

s.close()

del message_queues[s]

#连接关闭事件

elif flag& select.POLLHUP :

print"Closing", s.getpeername() ,"(HUP)"poller.unregister(s)

s.close()

#可写事件

elif flag& select.POLLOUT :try:

msg=message_queues[s].get_nowait()

except Queue.Empty:

print s.getpeername() ,"queue empty"poller.modify(s,READ_ONLY)else:

print"发送数据:" , data , "客户端:", s.getpeername()

s.send(msg)

#异常事件

elif flag& select.POLLERR:

print"exception on", s.getpeername()

poller.unregister(s)

s.close()

del message_queues[s]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"select"、"poll"和"epoll"都是用于处理I/O事件(如文件、网络连接等)的机制,它们在Linux系统中被广泛使用。这些机制都提供了一种方式来监视多个文件描述符(通常是网络连接或文件句柄)的状态,以便在数据可读、可写或其他事件发生时进行通知。 1. **select**:这是最早的I/O多路复用机制之一。它通过一个循环来检查多个文件描述符的状态,看是否有可用的输入或输出。然而,select在处理大量文件描述符时效率较低,因为它需要为每个文件描述符开一个单独的线程或进程。 2. **poll**:poll是另一种I/O多路复用机制,它提供了比select更高的效率,尤其是在处理大量文件描述符的情况下。但是,它的实现比较复杂,因此在一些新版本的Linux系统中,已经被更好的机制如epoll所取代。 3. **epoll**:相比于selectpollepoll提供了一种更有效的方式来处理大量的文件描述符。它的核心是一个事件循环(Event Loop),能够通过记录所有需要监听的事件来提高效率。当有事件发生时,epoll会立即通知应用程序。此外,epoll还支持非阻塞操作,可以更有效地处理并发连接。 在编程语言中,这些机制通常由操作系统提供的系统调用或库函数来实现。例如,在Python中,可以使用`select`模块来实现类似的功能。对于需要处理大量并发连接的服务器编程,使用Python的`socketserver`或`tornado`库或C语言的libevent库会更方便。 以上是对selectpollepoll的基本介绍。你可以根据项目需求和系统的具体配置来选择适合的I/O多路复用机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值