zoukankan      html  css  js  c++  java
  • 非阻塞io模型和io多路复用----select

    一。四种io阻塞
    1.io阻塞:
    (1 等待数据处于阻塞状态
    (2从内核copy到用户态处于阻塞状态
    2.非io阻塞
    只有从内核copy到用户态处于阻塞状态
    3.io多路复用-----》优势:可以同时监听多个对象
    (1从check-----》ready 通过selec函数来做,处于阻塞状态
    (2从内核copy到用户态处于阻塞状态
    3.异步io
    不用阻塞
    二。io多路复用
    select  poll epoll 都属于io同步里面的io多路复用
    select:轮询问题,监听数量有限
    poll:提高了监听数量
    epoll:解决了轮询问题

    ======================================================================================

    服务器端1

    #_author:来童星
    #date:2019/12/28
    #非阻塞io模型
    import socket
    import time
    sk=socket.socket()
    address=('127.0.0.1',8080)
    sk.bind(address)
    sk.listen(3)
    sk.setblocking(False)#将阻塞变为非阻塞
    while 1:
    try:
    coon,addr=sk.accept()
    print(addr)
    #while 1:
    data=coon.recv(1024)
    print(data.decode('utf8'))
    coon.close()
    #coon.sendall(data.upper())
    except Exception as e:
    print('Error:',e)
    time.sleep(3)
    客户端1
    #_author:来童星
    #date:2019/12/28
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8080)
    sk.connect(address)
    while 1:

    #inp=input('>>')
    sk.sendall('hello server'.encode('utf8'))
    data=sk.recv(1024)
    print(data.decode('utf8'))
    #ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。


    =============================================================================
    select server端
    #_author:来童星
    #date:2019/12/28
    #io多路复用----》水平触发,边缘触发
    #select用的是水平触发
    import socket
    import select
    sk1=socket.socket()
    address1=('127.0.0.1',8080)
    sk1.bind(address1)
    sk1.listen(3)

    sk2=socket.socket()
    address2=('127.0.0.1',8081)
    sk2.bind(address2)
    sk2.listen(3)
    r,w,e=select.select([sk1,sk2],[],[])
    print('rrr')
    for obj in r:
    coon,addr=obj.accept()
    print(addr)
    coon.sendall('hello client'.encode('utf8'))
    #coon--->client端信息
    #r------》sk对象
    select client端:
    #_author:来童星
    #date:2019/12/28
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8080)
    sk.connect(address)
    while 1:
    data=sk.recv(1024)
    print(data.decode('utf8'))
    inp = input('>>')
    sk.sendall(inp.encode('utf8'))


    ==================================================================
  • 相关阅读:
    C 字符串
    C 函数指针、回调函数
    C 指针
    C 数组、枚举类型enum
    C 函数声明、函数参数
    C 内置函数
    C 流程控制
    C 储存类与运算符
    C变量和常量
    名词解释
  • 原文地址:https://www.cnblogs.com/startl/p/12111279.html
Copyright © 2011-2022 走看看