博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO模型 IO多路复用
阅读量:6690 次
发布时间:2019-06-25

本文共 1786 字,大约阅读时间需要 5 分钟。

阻塞IO

用socket 一定会用到accept recv recvfrom这些方法 正常情况下 accept recv recvfrom都是阻塞的

非阻塞IO

如果setblocking(False) 整个程序就变成一个非阻塞的程序了
非阻塞的特点:   没有并发编程的机制   是一个同步的程序   程序不会在某一个连接的recv或者sk的accept上进行阻塞 缺点:   太多while True 高速运行着   大量的占用了CPU导致了资源的浪费
阻塞IO的问题:     一旦阻塞就不能做其他事情了 非阻塞IO的问题:     给CPU造成了很大的负担

 

import timeimport socketsk = socket.socket()sk.bind(('127.0.0.1',9000))sk.setblocking(False)   # 设置当前的socket server为一个非阻塞IO模型sk.listen()conn_l = []del_l = []while True:    try:        conn,addr = sk.accept()        conn_l.append(conn)   # [conn1,conn2]    except BlockingIOError:        for conn in conn_l:   # [conn1,conn2]            try:                conn.send(b'hello')                print(conn.recv(1024))            except (NameError,BlockingIOError):pass            except ConnectionResetError:                conn.close()                del_l.append(conn)        for del_conn in del_l:            conn_l.remove(del_conn)        del_l.clear()

 

 

 IO多路复用

io多路复用机制 select windows、mac\linux     底层是操作系统的轮询     有监听对象个数的限制     随着监听对象的个数增加,效率降低 poll mac\linux     底层是操作系统的轮询     有监听对象个数的限制,但是比select能监听的个数多     随着监听对象的个数增加,效率降低 epoll mac\linux     给每一个要监听的对象都绑定了一个回调函数     不再受到个数增加 效率降低的影响

import select  #  模块 用来操作操作系统中的select(IO多路复用)机制import socketsk = socket.socket()sk.bind(('127.0.0.1',9000))sk.setblocking(False)sk.listen()r_lst = [sk,]print(sk)while True:    r_l,_,_ = select.select(r_lst,[],[])  # r_lst = [sk,conn1,conn2,conn3]    for item in r_l:        if item is sk:            conn, addr = sk.accept()            r_lst.append(conn)        else:            try:                print(item.recv(1024))                item.send(b'hello')            except ConnectionResetError:                item.close()                r_lst.remove(item)

 

转载于:https://www.cnblogs.com/qq752059037/p/9714419.html

你可能感兴趣的文章
决心书
查看>>
Oracle案例11——Oracle表空间数据库文件收缩
查看>>
2018.11.03-dtoj-2092-交通 (traffic)
查看>>
内置模块(二)
查看>>
【HNOI2016】树
查看>>
Java Web整合开发(附录1) - 安装配置环境
查看>>
javascript对象创建
查看>>
linux解压war包的命令
查看>>
MyQThread new
查看>>
js的继承
查看>>
SOCKET用法详解
查看>>
C++11的新特性:右值引用
查看>>
memcache和redis的区别
查看>>
NodeJS、NPM安装配置步骤(windows版本)
查看>>
spring xml配置文件根元素(文件头文件)说明
查看>>
windows ssh RPi 2B
查看>>
Git常用命令
查看>>
异常,File,递归,IO流
查看>>
百度地图、ECharts整合HT for Web网络拓扑图应用
查看>>
大数据学习系列之三 ----- HBase Java Api 图文详解
查看>>