python epoll多路复用_多路复用(一):epoll原理

公众号:

灰子学技术(Go语言,架构相关知识,正在同步更新中-ing)

epoll的系统调用很简单,只有三个,其定义如下:

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

一,epoll的实现原理就是基于这三个函数来实现的,具体步骤如下:

首先,需要调用epoll_create来创建一个epoll的文件描述符,内核会同时创建一个eventpoll的数据结构。这个数据结构里面会包含两个东西,一个是红黑树,专门用于存储epoll_ctl注册进来的fd文件描述符;另外一个是就绪链表,用来存储epoll_wait调用相关的,已经就绪的那些fd文件描述符。

struct eventpoll{

struct rb_root rbr; // 红黑树的根节点,存储着所有添加到epoll中的需要监控的事件

struct list_head rdlist;//  双链表中存放着将要通过epoll_wait返回给用户的满足条件的事件

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的频分多路复用是通过使用select、poll或epoll等函数来实现的。这些函数允许程序同时监视多个文件描述符的可读、可写或错误事件,从而实现对多个I/O通道的高效管理。 频分多路复用的主要优点是可以在单个线程中同时处理多个I/O操作,从而提高程序的并发性能。它适用于需要同时监听多个网络连接或文件描述符的场景,常见的应用包括网络服务器、聊天程序等。 在Python中,可以使用select模块提供的select函数来实现频分多路复用。该函数接受三个参数:可读文件描述符列表、可写文件描述符列表和错误文件描述符列表,然后返回就绪的文件描述符列表。 以下是一个简单的示例代码,演示了如何使用select函数实现频分多路复用: ```python import select import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8000)) server_socket.listen(5) inputs = [server_socket] outputs = [] while True: readable, writable, exceptional = select.select(inputs, outputs, inputs) for sock in readable: if sock is server_socket: client_socket, client_address = server_socket.accept() inputs.append(client_socket) else: data = sock.recv(1024) if data: print(data.decode()) if sock not in outputs: outputs.append(sock) else: inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close() for sock in writable: sock.send(b'Hello, client!') outputs.remove(sock) for sock in exceptional: inputs.remove(sock) if sock in outputs: outputs.remove(sock) sock.close() ``` 在上述示例中,通过select.select函数来同时监听可读、可写和错误事件。当有新的客户端连接时,会将其加入到inputs列表中。读事件发生时,从客户端接收数据并将其输出。写事件发生时,向客户端发送数据。异常事件发生时,关闭连接。 总之,Python提供了一些函数和模块来实现频分多路复用,能够方便地处理多个I/O通道的并发操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值