zoukankan      html  css  js  c++  java
  • Day15

    本节内容

    1:Python/selectors模块

    2:selsect实例

    1:Python/selectors模块及队列

     selectors模块是可以实现IO多路复用机制:

    它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。

    常用IO多路复用共分为三种:
     
    select、poll、epoll
    
    且windows上只支持select,而linux上都支持

    select的缺点:

    1、每次调用都要将所有的文件描述符(fd)拷贝的内核空间,导致效率下降

    2、遍历所有的文件描述符(fd)查看是否有数据访问

    3、最大链接数限额(1024)

    poll:

    它就是select和epoll的过渡阶段,它没有最大链接数的限额

    epoll:

    1、第一个函数是创建一个epoll句柄,将所有的描述符(fd)拷贝到内核空间,但只拷贝一次。

    2、回调函数,某一个函数或某一个动作成功完成之后会触发的函数为所有的描述符(fd)绑定一个回调函数,一旦有数据访问就是触发该回调函数,回调函数将(fd)放到链表中

    3、函数判断链表是否为空

    4、最大启动项没有限额

    2:selsect实例:

     1 ###服务端################
     2 
     3 import selectors  #基于select模块实现的IO多路复用,建议大家使用
     4 import socket
     5 sock=socket.socket()
     6 sock.bind(('127.0.0.1',8800))
     7 sock.listen(5)
     8 sock.setblocking(False)
     9 sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll
    10 
    11 def read(conn,mask):
    12     try:
    13         data=conn.recv(1024)
    14         print(data.decode('utf8'))
    15         data2=input('>>>>')
    16         conn.send(data2.encode('utf8'))
    17     except Exception:
    18         sel.unregister(conn)
    19 
    20 def accept(sock,mask):
    21     conn,addr=sock.accept()
    22     print('-------',conn)
    23     sel.register(conn,selectors.EVENT_READ,read)
    24 
    25 sel.register(sock, selectors.EVENT_READ, accept)  #注册功能,一旦有反应继续往下执行
    26 
    27 while True:
    28     print('wating....')
    29     events=sel.select()   #event和select的监听对象[(sock),(),()]一样,都是在监听
    30 
    31     for key,mask in events:
    32         # print(key.data)       #accept   找出有活动的绑定函数
    33         # print(key.fileobj)    #sock     找出有活动的文件描述符
    34 
    35         func=key.data
    36         obj=key.fileobj
    37 
    38         func(obj,mask)  #1 accept(sock,mask) 2read(conn,mask)
    39 
    40 ##客户端#################
    41 import socket
    42 tin=socket.socket()
    43 tin.connect(('127.0.0.1',8800))
    44 while True:
    45     inp=input('>>>>')
    46     tin.send(inp.encode('utf8'))
    47     data=tin.recv(1024)
    48     print(data.decode('utf8'))

     

  • 相关阅读:
    被老板批评“公司离开谁都照转,谁的工作干不好谁走人”,你会立马辞职吗?
    开课啦 dubbo-go 微服务升级实战
    如何通过 Serverless 提高 Java 微服务治理效率?
    Alluxio 助力 Kubernetes,加速云端深度学习
    收藏!这些 IDE 使用技巧,你都知道吗
    基于 Wasm 和 ORAS 简化扩展服务网格功能
    基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
    Kubernetes 稳定性保障手册 -- 日志专题
    Kubernetes 稳定性保障手册 -- 极简版
    Serverless 如何在阿里巴巴实现规模化落地?
  • 原文地址:https://www.cnblogs.com/hero799/p/8642133.html
Copyright © 2011-2022 走看看