Python 之IO模型
阻塞IO模型:以前写的套接字通信都是阻塞型的。通过并发提高效率
非阻塞IO模型:
from socket import * # 并不推荐使用,一是消耗cpu资源,二是会响应延迟
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8087))
server.listen(5)
server.setblocking(False)
conn_list = []
wlist = []
while True: # 死循环,消耗cpu大
try:
conn,addr = server.accept() #等待连接
conn_list.append(conn)
print(conn_list)
except BlockingIOError: # 如果没有客户端发送连接请求,干通信活
del_list=[]
# 收消息
for conn in conn_list: # 如果有超多客户端时,可能会服务延迟
try:
data = conn.recv(1024)
if not data:
del_list.append(conn)
continue
wlist.append((conn,data.upper()))
except BlockingIOError:
continue
except Exception:
conn.close()
del_list.append(conn)
#发消息
del_wlist = []
for item in wlist:
try:
conn = item[0]
data = item[1]
conn.send(data)
del_list.append(item)
except BlockingIOError:
pass
for item in del_wlist:
wlist.remove(item)
for conn in del_list:
conn_list.remove(conn)
server.close()
多路复用IO模型,又叫事件驱动IO,使用select模块或poll(epoll)实现。
select模块优点:只用单线程(进程)执行,占用资源少,同时能为多客户端提供服务。
缺点:select()接口并不是实现‘事件驱动’的最好选择,因为当套接字较多时,需要消耗大量时间去轮询。很多操作系统提供了更为高效的接口,如
linux提供了epoll,BSD提供了kqueue,Solaris提供了/dev/poll。。。
epoll更被推荐(采用异步方式,有回调机制,不需轮询),遗憾的是各操作系统提供的epoll接口差异很大。
selector模块能根据平台选择IO多路复用的不同机制
import socket
import select
server = socket.socket()
server.bind(('127.0.0.1', 8800))
server.listen(5)
# sock.setblocking(False)
rlist = [server, ] # 有新客户端连接时,sock变化
wlist = []
wdata = {}
while 1:
rl, wl, el=select.select(rlist, wlist, [], 0.5) # 每过0.5s监听有变化的套接字(server或conn)
print('rl', rl)
print('wl', wl)
for sock in rl:
if sock == server:
conn,addr = sock.accept() # 客户端发消息时,conn变化
rlist.append(conn) # 有变化的conn加入rlist
print('server working...')
else:
try:
data = sock.recv(1024)
# linux上
if not data:
sock.close()
rlist.remove(sock)
continue
wlist.append(sock)
wdata[sock]=data.upper()
except Exception:
sock.close()
rlist.remove(sock)
for sock in wl:
data = wdata[sock]
sock.send(data)
wlist.remove(sock)
wdata.pop(sock)
异步IO模型
Python 之IO模型的更多相关文章
- python 浅析IO 模型
协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...
- python学习----IO模型
一.IO模型介绍 本文讨论的背景是Linux环境下的network IO. 本文最重要的参考文献是Richard Stevens的"UNIX® Network Programming Vol ...
- Python之IO模型
IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞 ...
- 《Python》IO模型
一.IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步:一件事情做完再做另一件事情 异步:同时做多件事情 阻塞:sleep.input.join.shutdown.get.acquire ...
- Python学习---IO模型1227
1.1. 事件驱动 事件驱动属于一种编程的范式,一种编程的风格,它擅长于处理一些未知的事件,通过绑定一个事件,外界触发后激活这个事情,达到执行某些操作的目的.比如浏览器的onclick()事件 1.2 ...
- python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors
一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块
python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
随机推荐
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏
怎样开发Qt插件,能够在Qt Assistant 中搜索"Qt Plugins"或"How to Create Qt Plugins",看看那篇manual中的 ...
- <LeetCode OJ> 337. House Robber III
Total Accepted: 1341 Total Submissions: 3744 Difficulty: Medium The thief has found himself a new pl ...
- 零基础学python-3.1 python基本规则和语句
1."#"凝视的開始 #凝视的东西 print("welcome") 2."\n"换行符 watermark/2/text/aHR0cDov ...
- 系统函数C字符串的实现(11):strchr
字符查找函数strchr char *mystrchr(const char *str, const char c) { char *p = NULL; for (char*newp = str; * ...
- inline-block的使用
inline-block是什么 inline和block是css中元素display属性的两个选项,而inline-block可以说是介于两者之间的属性值. inline使元素成为内联元素(inlin ...
- Django框架学习——python模拟Django框架(转载)
原贴来源 http://wiki.woodpecker.org.cn/moin/ObpLovelyPython/AbtWebModules python实现web服务器 web开发首先要有web服务器 ...
- hdu1028(母函数+DP)
题目信息:求分解整数n的个数q(n);能够母函数或者DP http://acm.hdu.edu.cn/showproblem.php?pid=1028 AC代码: /***************** ...
- 什么是aop?-------转
什么是AOP? http://www.cnblogs.com/zhugenqiang/archive/2008/07/27/1252761.html#commentform(转) AOP(Aspec ...
- STM32 ~ ili9341 横屏驱动代码
void ili9341_Initializtion(void) { u16 i; RCC->APB2ENR|=<<; //使能PORTB时钟 GPIOB->CRH&= ...
- Codeforces Round #407 (Div. 1) B. Weird journey —— dfs + 图
题目链接:http://codeforces.com/problemset/problem/788/B B. Weird journey time limit per test 2 seconds m ...