day18 io多路复用

day18
今天学习内容:
 
  1. io多路复用--select
在win下 : io多路复用就是使用底层的select去进行对io句柄的监控
通过select 可以进行server 和client 的句柄进行监控,当发生读写时,可以动态去处理。
 
     example:
          
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
 
import select
import socket
 
sk = socket.socket()
sk.bind(('127.0.0.1',9999))
sk.listen()
 
inp = [sk]
inps = []
oups = []
msg_dict = {}
inpp = []
while True:
    #参数1 是监控socket句柄列表,一旦服务端/客户端句柄发生动作则处理
    #参数2 如果存在句柄,则会对句柄进行一个处理,譬如当读取到数据,则将客户端的链接添加到inps,在下一个循环中去处理接受到的数据
    #参数3 是当发生socket错误时,该参数接收到发生错误的句柄
    #参数4 指定io的一个循环等待时间,这里时最多1秒
    r,w,e = select.select(inp,inps,inp,1)
 
    for s in r:
        #如果是服务端接受链接则添加到inp的监听队列
        if s == sk:
            conn,address = s.accept()
            inp.append(conn)
            msg_dict[conn]=[]
        else:
            try:
                msg_dict[s].append(str(s.recv(1024),encoding='utf-8'))
                inps.append(s)
            except Exception as ex:
                print(ex)
                inp.remove(s)
 
    for s1 in w:
        print(msg_dict[s1][0])
        ret = msg_dict[s1][0]+'好'
        del msg_dict[s1][0]
        s1.sendall(bytes(ret,encoding='utf-8'))
        inps.remove(s1)
 
    for s2 in e:
        inp.remove(s2)
 
 
  1. 还有socketserver源码分析
  2. ftp作业讲解
原文地址:https://www.cnblogs.com/zxcv-/p/7967532.html