zoukankan      html  css  js  c++  java
  • python select 实现IO异步

    import  select
    import  socket
    import  queue
    
    server = socket.socket()
    server.bind(('localhost',9000))
    server.listen(1000)
    
    #设置为非阻塞,导致revc没数据的时候不阻塞
    server.setblocking(0)
    msg_div = {}
    
    inputs = [server,]
    outputs= []
    
    while True:
        readable,writable,excepional =  select.select(inputs,outputs,inputs)
        for r in readable:
            #代表来了一个新连接
            if r is server:
                conn,addr = server.accept()
                print(conn,addr)
            #因为这个新建立的连接还没发数据过来,而且我们将socket 设置为非阻塞,现在接收会报错
            #所以需要让select 检查conn
                inputs.append(conn)
                #初始化一个队列,后边存储要返回给客户端的数据
                msg_dic=[conn]=queue.Queue()
            else:
                data = r.recv(1024)
                print("收到数据:",data)
                msg_dic[r].put(data)
                #放入返回的连接队列里
                outputs.append(r)
                # r.send(data)
        #要返回给客户端的链接列表
        for w in writable:
            data_to_client = msg_dic[w].get()
            #返回给客户端
            w.send(data_to_client)
    
            #清除旧链接
            outputs.remove(w)
    
        for e in excepional:
            if e in outputs:
                outputs.remove(e)
            inputs.remove(e)
            del msg_dic[e]
  • 相关阅读:
    go-go协程
    linux-pclint代码检测
    linux-32位-交叉编译openssl
    go-json类
    mysql-定时任务
    go-IO操作
    go-异常处理-error-panic-recover
    go-defer语句
    go-select
    go-指针
  • 原文地址:https://www.cnblogs.com/gaizhongfeng/p/8064803.html
Copyright © 2011-2022 走看看