美文网首页
非阻塞IO

非阻塞IO

作者: whenitsallover | 来源:发表于2018-03-13 21:19 被阅读0次

代码:

#服务端
from socket import *
from threading import Thread


server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8099))
server.listen(5)
server.setblocking(False)


rlist=[]
wlist=[]
while True:
    try:
        conn, addr = server.accept()
        rlist.append(conn)
        print(rlist)

    except BlockingIOError:
        del_rlist=[]
        for sock in rlist:
            try:
                data=sock.recv(1024)
                if not data:
                    del_rlist.append(sock)
                wlist.append((sock,data.upper()))
            except BlockingIOError:
                continue
            except Exception:
                sock.close()
                del_rlist.append(sock)

        del_wlist=[]
        for item in wlist:
            try:
                sock = item[0]
                data = item[1]
                sock.send(data)
                del_wlist.append(item)
            except BlockingIOError:
                pass

        for item in del_wlist:
            wlist.remove(item)


        for sock in del_rlist:
            rlist.remove(sock)

server.close()

#客户端
from socket import *

client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8099))


while True:
    msg=input('>>: ').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data=client.recv(1024)
    print(data.decode('utf-8'))

client.close()

非阻塞IO模型绝不被推荐。

There is no deny that there is a lot can be done while we are waiting for the task(which means that multiple tasks are being done backends.)
But it's got to take its toll:·

#1. 循环调用recv()将大幅度推高CPU占用率;这也是我们在代码中留一句time.sleep(2)的原因,否则在低配主机下极容易出现卡机情况
#2. 任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
此外,在这个方案中recv()更多的是起到检测“操作是否完成”的作用,实际操作系统提供了更为高效的检测“操作是否完成“作用的接口,例如select()多路复用模式,可以一次检测多个连接是否活跃。

相关文章

  • IO模型

    原文参考链接 四种状态 同步 异步 阻塞 非阻塞 IO分类 同步阻塞IO 同步非阻塞IO 异步非阻塞IO注意: 没...

  • 非阻塞IO

    非阻塞io(NIO)包含两重含义:1、连接阻塞 -> 连接非阻塞 2、io阻塞 -> io非阻塞nio包下Ser...

  • Java IO快速入门

    网络IO实现方式分为BIO(阻塞IO)、线程池伪异步IO、NIO(非阻塞IO)、AIO(异步非阻塞IO); 异步、...

  • 阻塞非阻塞 同步异步 IO模型及其应用 NIO实现原理

    1.同步异步概念 2.阻塞非阻塞概念 3.常见I/O模型:同步阻塞IO,同步非阻塞IO,异步阻塞IO,异步非阻塞I...

  • 操作系统 JVM

    非阻塞IO和异步IO(NIO、AIO) 非阻塞 IO 说完了阻塞模式的使用及其缺点以后,我们这里就可以介绍非阻塞 ...

  • BIO NIO AIO

    BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。 io操作分...

  • 2018-07-25

    网络IO之阻塞、非阻塞、IO复用、异步IO、同步IO 之前在看一些资料的过程中,经常提到阻塞、非阻塞、IO复用、异...

  • Netty-基础篇(1)-网络IO,同步IO&异步IO,阻塞IO

    目录: 1、阻塞IO(Block IO)与非阻塞IO(Non-Block IO)1.1、阻塞IO(Block IO...

  • Java Socket IO演进(一)-BIO/NIO/AIO

    1. 概览 Java中主要有三种IO模型,分别是同步阻塞IO(BIO)、同步非阻塞IO(NIO)、异步非阻塞IO(...

  • I/O详解之BIO,NIO,AIO概念

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 1.IO场景 同步阻塞IO(B...

网友评论

      本文标题:非阻塞IO

      本文链接:https://www.haomeiwen.com/subject/egdhfftx.html