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

     

  • 相关阅读:
    30. 串联所有单词的子串
    206. 反转链表及扩展
    leetcode合并专题(陆续补充)
    剑指 Offer 25. 合并两个排序的链表及扩展
    1371. 每个元音包含偶数次的最长子字符串
    1334. 阈值距离内邻居最少的城市
    1310. 子数组异或查询
    1297. 子串的最大出现次数
    VS2012安装后 VS2010出现fatal error LNK1123: failure during conversion to COFF
    BFS/DFS 模板 代码
  • 原文地址:https://www.cnblogs.com/hero799/p/8642133.html
Copyright © 2011-2022 走看看