欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【学习笔记_python进阶】epoll版本服务器

程序员文章站 2022-06-13 22:46:33
...

相比线程进程协程实现的多任务服务器,效率大大提高

前者工作原理是 linux底层中,服务器所占进程空间和内核空间分开,通过遍历监听套接字,判断客户端是否有传来数据。从服务器运行内存中遍历监听套接字对应fd复制到内核内存,操作系统才可以调用fd对应的方法完成任务。

后者epoll

1.操作系统中一个特殊的内存空间,内核和服务器共享的内存空间,节省了复制的过程

2.事件通知方式

【学习笔记_python进阶】epoll版本服务器

没理解透


  1 import select
  2 
  3 
  4 # 创建epoll对象
  5 epl = select.epoll()
  6 
  7 # 将监听套接字对应的fd注册到epoll中
  8 epl.register(tcp_server_socket.fileno(), select.EPOLLIN)
  9 
 10 # 文件描述符字典
 11 fd_event_dict = dict()
 12 
 13 while True:
 14 
 15     fd_event_list = epol.poll()
 16 
 17     for fd, event in fd_event_dict:
 18         new_socket, client_addr = tcp_server_socket.accept()
 19         epl.register(new_socket.fileno(), select.EPOLLIN)
 20         fd_event_dict[new_socket.fileno()] = new_socket
 21 
 22     elif event == select.EPOLLIN:
 23         recv_data = fd_event_dict[fd].recv(1024).decode("utf-8")
 24         if recv_data:
 25             service_client(fd_event_dict[fd], recv_data)
 26         else:
 27             fd_event_dict[fd].close()
 28             epl.unregister(fd)
 29             del fd_event_dict[fd]
 30