zoukankan      html  css  js  c++  java
  • python3 IO模型

    概念:同步IO,异步IO ,阻塞IO,非阻塞IO

    五种IO模型:

      blocking IO(阻塞IO)-了解

      nonblocking IO(非阻塞IO)-了解

      IO multiplexing(IO多路复用)-熟悉

      signal driven IO(信号驱动IO)-忽略

      asynchronous IO(异步IO)-熟悉

    select模块实现IO多路复用(单线程实现并发

    import socket
    import select
    
    sock = socket.socket()
    sock.bind(('127.0.0.1',8080))
    sock.listen(5)
    
    inp = [sock,]   # 监听的套接字对象的列表,连接后,添加conn
    
    while True:
        r = select.select(inp,[],[])  # [sock,conn1,conn2,conn3]  做了sock.accept()的第一件事
        print('r',r[0])
    
        for obj in r[0]:
            if obj == sock:
                conn,addr = obj.accept(conn)
    
            else:
                data = obj.recv(1024)
                print(data.decode('utf8'))
                resp = input('>>>')
                obj.send(resp.encode('utf8'))

    selectors模块实现(常用)

    import selectors
    import socket
    
    sel = selectors.DefaultSelector()
    
    sock = socket.socket()
    sock.bind(('127.0.0.1',8080))
    sock.listen(5)
    sock.setblocking(False)
    
    def accept(sock,mask):
        conn,addr = sock.accept()
        sel.register(conn,selectors.EVENT_READ,read)
    
    def read(conn,mask):
        data = conn.recv(1024)
        print(data.decode("utf8"))
        resp = input(">>>>>")
        conn.send(resp.encode("utf8"))
    
    # 绑定套接字对象和函数
    sel.register(sock,selectors.EVENT_READ,accept)  # 注册对象fileobj,event,data
    
    while True:
    
        events = sel.select()    # 监听套接字对象
        print('events:',events)
        for key,mask in events:
            callback = key.data # accept或者read
            callback(key.fileobj,mask)  # key.fileobj,sock或者conn
  • 相关阅读:
    [NOIP模拟赛][贪心]奶牛晒衣服.
    BZOJ3750: [POI2015]Piecz
    BZOJ2348 [Baltic 2011]Plagiarism
    高精度乘法【高乘高
    codevs 1215 迷宫
    变量交换
    a+b问题与圆柱体表面积的计算
    算数表达式的练习
    [bzoj1070][SCOI2007]修车[ 网络流]
    [bzoj2502]清理雪道[上下界网络流]
  • 原文地址:https://www.cnblogs.com/lucaq/p/7225291.html
Copyright © 2011-2022 走看看