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'))

     

  • 相关阅读:
    设置页面标题title
    路由跳转,页面位置不在顶部
    PyTorch深度学习入门
    删除ubuntu后开机进入grub的解决办法
    研一上英语
    python中常用的几个函数的正确用法-lambda/filter/map/reduce
    【Python教程】 re 模块中findall() 函数返回值展现方式的用法详解
    【Python教程】5种常见字符串去除空格的操作方法
    对python中浅拷贝和深拷贝分析详细介绍
    Git使用
  • 原文地址:https://www.cnblogs.com/hero799/p/8642133.html
Copyright © 2011-2022 走看看