🧑‍🏫
liualexiang
  • Introduction
  • Azure
    • AKS Basic
    • AKS Spark
    • AZ ACR SYNC
    • Azure CMI SDWAN
    • Azure LB DeepDive
      • Azure LB DeepDive
    • Azure Service Principal Basic
    • Azure Internal VM Network Connectivity
      • Azure Internal VM Network Connectivity
    • Azure Cli Build
    • Azure Vm Memory Monitor
  • Blockchain
    • BTC
  • CRISPR
    • 使用Parallel_Cluster提升CRISPA效率
  • OpenSource
    • ElasticSearch
      • ES Get Started
      • ES Search Query
      • Kibana 可视化
      • Logstash配置
    • Ansible 基础
    • Infra As Code
      • Pulumi Get Started
      • Terraform Basic
    • ZooKeeper 基础
    • RPC与REST
    • 使用Python申请大量内存测试
    • 使用TPC_DS产生压测数据
    • Superset
      • Superset部署手册
    • 代码扫描
    • Git
      • Git Basic
      • Github Action Basic
      • Gitlab与AzureAD集成
      • Gitbook 基础教程
    • K8S
      • enter_node
      • K8s X509 Client Cert
      • K8s Basic
      • K8s Oidc
      • Docker 基础
      • helm基础
      • K8S_Secrets管理
      • 深入了解K8S
      • 混沌工程
      • Istio
      • 生态
      • CRD开发
      • k8s网络
    • Cloud_Custodian
    • Jenkins Basic
    • Nginx
    • ETCD
    • 正则
    • VictoriaMetrics
    • Kafka
  • MySQL
    • MySQL 调优
  • Linux
    • SSH Tunnel 上网
    • 内存管理
    • 在Linux系统中通过LUKS加密磁盘
    • 量子计算 Basic
    • IO多路复用
    • Iptables
    • tmux和screen
    • Systemd
    • OS 基础
    • jq基础
    • yum
    • neovim
  • Web
    • Html Css
    • Web部署
    • 缓存
  • Programming
    • 算法
      • 返回list中最大生序子序列长度
    • Python技巧
      • Python的语法糖
      • Python常用装饰器
      • AsyncIO基础
      • 自动化测试pytest
      • python中的下划线
      • 面向对象
      • Python的坑
      • Python配置文件管理
      • HTTP Stream Response
      • Python项目管理
    • 设计模式
      • 设计模式
      • 面向对象的思想
      • 编程概念
    • Go
      • Go 基础
      • Go常用功能
      • 结构体入门
    • 前端
    • Vue
    • NodeJS
  • Math
    • 多项式插值法
  • Security
    • HTTP常见攻击
    • 加密与签名
    • RSA
    • ECDSA
  • Solidity
    • Solidity基础
    • Blockchain Testnet Faucet
  • Tools
    • 视频处理ffmpeg
    • IDE配置
    • iTerm2美化
    • 密码管理
    • FRP配置
    • 工具集
由 GitBook 提供支持
在本页
  1. Linux

IO多路复用

Linux有三种方式实现IO多路复用,分别是 Select, poll和 epoll,但windows 只支持 Select。Select是最早的IO 多路复用技术,后来才有的poll,之后才有 epoll

Select 有一个限制,就是只能支持1024个以内的文件描述符,超出的话就没法监听了。是通过 for 循环实现的。 poll也是类似的,但没有1024个显示。

epoll是通过异步的方式实现的,底层的描述符谁有变化了,谁告诉 epoll,不用程序去做for循环去看描述符的变化了。

Select IO 多路复用示例

以python程序为例,socket 监听了8001和8002两个端口,使用 select.select 来查看这两个 socket的状态,一旦文件描述符发生变化,就会将变动传送给 r_list 里,其中 e_list 是指有错误的话,会发到这里。select.select 接收的4个参数,第一个指的是,监听哪个list的变化,第二个参数是永久固定的将这个list返回给 w_list,第三个参数指的是有错误发给 e_list,最后一个1指的是每隔1秒检查一次。

import socket, select
s1 = socket.socket()
s1.bind(("127.0.0.1",8001))
s1.listen()

s2 = socket.socket()
s2.bind(("127.0.0.1",8002))
s2.listen()

s_list = [s1, s2]
while True:
    r_list, w_list, e_list = select.select(s_list,[],s_list, 1)
    for sk in r_list:
        conn, address = sk.accept()
        conn.sendall(bytes("ok",encoding="utf-8"))
        conn.close()

    #如果有这一步的话,指的是谁出错,就将其从list里移除
    for sk in e_list:
        s_list.remove(sk)
上一页量子计算 Basic下一页Iptables

最后更新于6个月前