Python之io概念
"""
同步,异步:
强调结果,调用者最终是否得到想要的结构
阻塞非阻塞:
强调时间是否等待 io二个阶段
1.数据准备阶段
2.内核空间复制回用户空间缓冲区阶段 发生io时候
1.内核从输入设备读,写数据
2.进程从内核复制数据 io模型
1.同步io包括阻塞io,非阻塞io,io多路复用
阻塞io:进程等待(阻塞),直到读写完成
非阻塞io:
进程调用read操作,如果io没有准备好,立即返回error,进程不阻塞
用户可以再次发起系统调用,内核准备好,就阻塞,复制数据到用户空间
io多路复用:
就是同时监控多个io,有一个准备好,就不需要等待了开始处理,提高了同时处理io的功能
select所以的平台都支持,poll是对其的升级,epoll对poll的曾强增加回调机制,select最多监控
1024个fd,select轮询的方式,效率低下
epoll,fd没有上限,并且是回调机制,不需要遍历,效率高
2.异步io
进程发起异步io请求,立即返回,内核完成io的二个阶段,内核给进程发一个信号
linix aio的系统调用
"""
'''
abstractmethod register(fileobj,events,data=None)
为selector注册一个文件对象,监视他的io事件
fileobj被监视文件对象,例如socket
events事件,该文件对象必须等待的事件
data可选的与此文件对象相关联的不透明数据,例如关联用来存储每个客户端的会话id
event_read 可读0b01内核准备好输入输出设备,可以开始读了
event_write可写0b10内核准备好了,可以写了
'''
io多路复用
import selectors
import socket
#在winodws上使用的是select,移植到linux就是epoll
#recv,send就是io操作
sel = selectors.DefaultSelector() def accept(sock, mask):
conn, addr = sock.accept() # Should be ready
print('accepted', conn, 'from', addr)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read) #产生new_socket的时候调用read函数 def read(conn, mask):
data = conn.recv(1000) # Should be ready
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data) # Hope it won't block
else:
print('closing', conn)
sel.unregister(conn)
conn.close() sock = socket.socket() #产生fileobj
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False) #非阻塞,要求
sel.register(sock, selectors.EVENT_READ, accept) ##参数fileobj,events,data=None(回调函数,或者数据)
'''
产生socket,就是有连接请求,传给回调函数执行 sock,selectors.EVENT_READ说明socket和读就绪后执行accept
'''
# key = sel.register(sock, selectors.EVENT_READ, accept) key有四个属性,fileobj,fd,events,data while True:
events = sel.select() #阻塞,直到events(读,写)
for key, mask in events: #key有四个属性,fileobj,fd,envets,data(accept,read等回调函数)
callback = key.data #当socket接入时,key.data = accept
callback(key.fileobj, mask) #accept(key.fileobj,mask) ,key.ffileoj就是sock
import socket
import threading
import datetime
import selectors class ChatServer:
def __init__(self,ip='127.0.0.1',port=9999):
self.sock = socket.socket
self.addr = (ip,port)
self.event = threading.Event()
self.selector = selectors.DefaultSelector() def start(self):
self.sock.bind(self.addr)
self.sock.listen()
self.sock.setblocking(False)
self.selector.register(self.sock,selectors.EVENT_READ,self.accept)
threading.Thread(target=self.select,daemon=True).start() def select(self):
while not self.event.is_set():
events = self.selector.select()
for key,mask in events:
callback = key.data
callback(key.fileobj) def accept(self,sock:socket.socket):
conn,addr = sock.accept()
conn.setblocking(False)
self.selector.register(conn,selectors.EVENT_READ,self.receive) def receive(self,sock:socket.socket):
data = sock.recv(1024)
if data ==b"":
self.selector.unregister()
self.sock.close()
return
msg = '{}:{}\n{}\n'.format(*sock.getpeername(),data.decode())
for key in self.selector.get_map().values():
if key.data==self.receive: #排除self.accept
key.fileobj.send(msg)
def stop(self):
self.event.set()
fobjs = []
for fd,key in self.selector.get_map().items():
fobjs.append(key.fileobj)
for fobj in fobjs:
self.selector.unregister(fobj)
fobj.close()
self.selector.close() def main():
cs = ChatServer()
cs.start()
while True:
cmd = input(">>>")
if cmd == 'quit':
cs.stop()
break
if __name__ == '__main__':
main()
Python之io概念的更多相关文章
- python之IO多路复用
在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...
- Python异步IO --- 轻松管理10k+并发连接
前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...
- python异步IO编程(一)
python异步IO编程(一) 基础概念 协程:python generator与coroutine 异步IO (async IO):一种由多种语言实现的与语言无关的范例(或模型). asyncio ...
- Python文件IO
Python文件IO 有如下文本内容,文件路径为D:\temp,文件名称为lyric.txt, line1 Look ! line2 If U had one shot line3 One oppor ...
- {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_3] Python 函数 & IO
0. 说明 Python 函数 & IO 笔记,基于 Python 3.6.2 参考 Python: read(), readline()和readlines()使用方法及性能比较 Pyt ...
- python异步IO编程(二)
python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...
- python同步IO编程——基本概念和文件的读写
IO——Input/Output,即输入输出.对于计算机来说,程序运行时候数据是在内存中的,涉及到数据交换的地方,通常是磁盘.网络等.比如通过浏览器访问一个网站,浏览器首先把请求数据发送给网站服务器, ...
- Python - 异步IO\数据库\队列\缓存
协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...
随机推荐
- [Error]Python虚拟环境报错 OSError: setuptools pip wheel failed with error code 2
mkvirtualenv py35 python新建虚拟环境报错,setuptools pip wheel failed with error code 2 刚好昨天在CentOS安装的时候也总是报s ...
- 使用python处理地理数据:Geopandas
说句实话处理地理数据使用python还是比较麻烦的
- luo3372线段树模板的分块做法
题目大意 请你维护一个有n个元素的整数序列,要求支持区间查询&区间修改 对于100%的数据,\(1<=n<=10^5\) 分析 正常做法是线段树维护区间修改.区间查询,今天我要讲的 ...
- css 基本语法及页面引用:
css基本语法: css的定义方法是: 选择器{ 属性:值; 属性:值; 属性:值; } 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性,每个属性有一个或多个值. 如: div{ w ...
- [LeetCode] Cheapest Flights Within K Stops K次转机内的最便宜的航班
There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...
- windbg源码驱动调试 + 无源码驱动调试
windbg源码驱动调试 环境信息 虚拟机:win7 32位 windbg:6.12(版本不存在太大影响) 设置过程 windbg与虚拟机连接:链接 配置windbg 配置好双机调试后,点击win ...
- JMeter参数化中存在逗号的解决方法
在Jmeter中通过CSV Data Set Config进行参数化时,如果参数化数据中存在逗号(,)我们可以通过一下方式进行设置 如何存在中文乱码,可以设置file encoding:gb2312
- windows redis 自动启动
start.bat D: D:\dev\redis- redis-server.exe redis.conf redis.vbs createobject( 之后,把 start.bat 放在redi ...
- robot 中文 乱码 问题 的处理
第一种方式: def unic(item): if isinstance(item, unicode): return item if isinstance(item, (bytes, ...
- JAVA生成(可执行)Jar包的全面详解说明 [打包][SpringBoot][Eclipse][IDEA][Maven][Gradle][分离][可执行]
辛苦所得,转载还请注明: https://www.cnblogs.com/applerosa/p/9739007.html 得空整理了关于java 开发中,所有打包方式的 一个操作方法, 有基于ID ...