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
  • 相关阅读:
    用“Keras”11行代码构建CNN
    技术 | 使用深度学习检测DGA(域名生成算法)
    未来的超级智能网络攻击需要AI竞技俱乐部来拯救
    开源中国的代码托管
    Hello Java !
    15-include的使用
    14-递归函数
    13-函数的调用
    12-函数的返回值
    11-函数的参数
  • 原文地址:https://www.cnblogs.com/lucaq/p/7225291.html
Copyright © 2011-2022 走看看