Python的epoll对象是用于I/O多路复用的高效机制,它可以通过边缘触发和水平触发两种方式来监视文件描述符上的事件
▥Python
𝄐 0
python碰到边缘就反弹,python sobel边缘检测,边缘触发器,python 边缘检测,python边缘检测代码,python边缘检测算法
Python的epoll对象是用于I/O多路复用的高效机制,它可以通过边缘触发和水平触发两种方式来监视文件描述符上的事件。
边缘触发(edge-triggered)模式是指当文件描述符上的状态变化时才会通知应用程序处理。例如,如果一个套接字在读取数据前有10个字节可供读取,那么只会通知一次可读事件,而不是每次读取1个字节时都会通知一次。这就需要应用程序能够及时读取完整的数据。
水平触发(level-triggered)模式是指只要文件描述符上还有事件未被处理,就会持续通知应用程序处理。例如,如果一个套接字在读取数据前有10个字节可供读取,那么会不断地通知可读事件,直到所有数据都被读取完为止。
以下是使用Python的select和epoll模块实现边缘触发和水平触发的简单例子:
边缘触发示例代码(使用epoll):
python
import socket
import select
# 创建TCP套接字并绑定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5555))
server_socket.listen()
# 创建epoll对象并注册监听事件
epoll = select.epoll()
epoll.register(server_socket.fileno(), select.EPOLLIN | select.EPOLLET)
while True:
# 等待事件通知
events = epoll.poll(timeout=1)
for fd, event in events:
if fd == server_socket.fileno():
# 有新连接
client_socket, address = server_socket.accept()
print(f'New connection from {address}')
# 注册新客户端套接字的事件
epoll.register(client_socket.fileno(), select.EPOLLIN | select.EPOLLET)
elif event & select.EPOLLIN:
# 可读事件
data = ''
while True:
try:
chunk = os.read(fd, 1024).decode('utf-8')
data += chunk
except BlockingIOError:
break
except ConnectionResetError:
# 客户端关闭了连接
epoll.unregister(fd)
os.close(fd)
break
print(data)
水平触发示例代码(使用select):
python
import socket
import select
# 创建TCP套接字并绑定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5555))
server_socket.listen()
# 注册监听事件
inputs = [server_socket]
while True:
# 等待事件通知
readable, _, _ = select.select(inputs, [], [], 1)
for sock in readable:
if sock == server_socket:
# 有新连接
client_socket, address = server_socket.accept()
print(f'New connection from {address}')
inputs.append(client_socket)
else:
# 可读事件
data = ''
while True:
try:
chunk = sock.recv(1024).decode('utf-8')
data += chunk
except BlockingIOError:
break
except ConnectionResetError:
# 客户端关闭了连接
inputs.remove(sock)
sock.close()
break
print(data)
Python的epoll对象是用于I/O多路复用的高效机制,它可以通过边缘触发和水平触发两种方式来监视文件描述符上的事件。
边缘触发(edge-triggered)模式是指当文件描述符上的状态变化时才会通知应用程序处理。例如,如果一个套接字在读取数据前有10个字节可供读取,那么只会通知一次可读事件,而不是每次读取1个字节时都会通知一次。这就需要应用程序能够及时读取完整的数据。
水平触发(level-triggered)模式是指只要文件描述符上还有事件未被处理,就会持续通知应用程序处理。例如,如果一个套接字在读取数据前有10个字节可供读取,那么会不断地通知可读事件,直到所有数据都被读取完为止。
以下是使用Python的select和epoll模块实现边缘触发和水平触发的简单例子:
边缘触发示例代码(使用epoll):
python
import socket
import select
# 创建TCP套接字并绑定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5555))
server_socket.listen()
# 创建epoll对象并注册监听事件
epoll = select.epoll()
epoll.register(server_socket.fileno(), select.EPOLLIN | select.EPOLLET)
while True:
# 等待事件通知
events = epoll.poll(timeout=1)
for fd, event in events:
if fd == server_socket.fileno():
# 有新连接
client_socket, address = server_socket.accept()
print(f'New connection from {address}')
# 注册新客户端套接字的事件
epoll.register(client_socket.fileno(), select.EPOLLIN | select.EPOLLET)
elif event & select.EPOLLIN:
# 可读事件
data = ''
while True:
try:
chunk = os.read(fd, 1024).decode('utf-8')
data += chunk
except BlockingIOError:
break
except ConnectionResetError:
# 客户端关闭了连接
epoll.unregister(fd)
os.close(fd)
break
print(data)
水平触发示例代码(使用select):
python
import socket
import select
# 创建TCP套接字并绑定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5555))
server_socket.listen()
# 注册监听事件
inputs = [server_socket]
while True:
# 等待事件通知
readable, _, _ = select.select(inputs, [], [], 1)
for sock in readable:
if sock == server_socket:
# 有新连接
client_socket, address = server_socket.accept()
print(f'New connection from {address}')
inputs.append(client_socket)
else:
# 可读事件
data = ''
while True:
try:
chunk = sock.recv(1024).decode('utf-8')
data += chunk
except BlockingIOError:
break
except ConnectionResetError:
# 客户端关闭了连接
inputs.remove(sock)
sock.close()
break
print(data)
本文地址:
/show-276138.html
版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。