• 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
  • 相关阅读:
    laravel5.2总结--blade模板
    laravel5.2总结--响应
    laravel5.2总结--请求
    git总结
    laravel5.2总结--路由
    Get与Post的一些总结
    python库安装
    iptables的recent模块
    iptables
    dmucs与distcc
  • 原文地址:https://www.cnblogs.com/lucaq/p/7225291.html
Copyright © 2020-2023  润新知