zoukankan      html  css  js  c++  java
  • 非阻塞io模型,阻塞io模型

    非阻塞io模型
    import socket
    import time

    server=socket.socket()
    server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    server.bind(('127.0.0.1',8083))
    server.listen(5)

    server.setblocking(False) #设置不阻塞
    r_list=[] #用来存储所有来请求server端的conn连接
    w_list={} #用来存储所有已经有了请求数据的conn的请求数据

    while 1:
    try:
    conn,addr=server.accept() #不阻塞,会报错
    r_list.append(conn) #为了将连接保存起来,不然下次循环的时候,上一次的连接就没有了
    except BlockingIOError:
    # 强调强调强调:!!!非阻塞IO的精髓在于完全没有阻塞!!!
    # time.sleep(0.5) # 打开该行注释纯属为了方便查看效果
    print('在做其他的事情')
    # print('rlist: ',len(r_list))
    # print('wlist: ',len(w_list))


    # 遍历读列表,依次取出套接字读取内容
    del_rlist=[] #用来存储删除的conn连接
    for conn in r_list:

    try:
    data=conn.recv(1024) #不阻塞,会报错
    if not data: #当一个客户端暴力关闭的时候,会一直接收b'',别忘了判断一下数据
    conn.close()
    del_rlist.append(conn)
    continue
    w_list[conn]=data.upper()


    except BlockingIOError: # 没有收成功,则继续检索下一个套接字的接收
    continue
    except ConnectionResetError: # 当前套接字出异常,则关闭,然后加入删除列表,等待被清除
    conn.close()
    del_rlist.append(conn)


    # 遍历写列表,依次取出套接字发送内容
    del_wlist=[]
    for conn,data in w_list.items():
    try:
    conn.send(data)
    del_wlist.append(conn)
    except BlockingIOError:
    continue


    # 清理无用的套接字,无需再监听它们的IO操作
    for conn in del_rlist:
    r_list.remove(conn)
    #del_rlist.clear() #清空列表中保存的已经删除的内容
    for conn in del_wlist:
    w_list.pop(conn)
    #del_wlist.clear()


    #非阻塞io模型
    import socket
    import time

    server=socket.socket()
    server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    server.bind(('127.0.0.1',8083))
    server.listen(5)
    print('你看看卡在哪')
    server.setblocking(False)
    while 1:
    try:
    conn, addr = server.accept()
    print('来自%s的链接请求'%addr)
    except BlockingIOError:
    print('去买点药')
    time.sleep(0.1)

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/li-123-peng/p/9877059.html
Copyright © 2011-2022 走看看