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.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...
随机推荐
- ISP PIPLINE(零) 知识综述预热之光学概念篇
1.光学成像关系如下:这是我看到最清晰的易懂的数学关系图 2.上面的知识了解完,camera应用的知识就是Autofocus技术,自动对焦 马达的起始位置一般在焦距处,由上面光学数学关系可知,焦距处可 ...
- NOIP2011 D2T3 观光公交 做题笔记
目录 归纳题目的性质 算法 60分 100分 code 大家来找茬 总结 归纳题目的性质 每一个加速器效果相同(1) 车子等到所有人上车之后才会发车, 这个最早发车时间不由加速器的配比决定(2) 要优 ...
- Think twice, code once.
.Think twice, code once. .WJMZBMR神犇的话 我还记得很久以前有人跟我说的话,自己选择的路,跪着也要走完.朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感 ...
- Linux下的文件切割和文件合并
linux下文件分割可以通过split命令来实现,可以指定按行数分割和按大小分割两种模式.Linux下文件合并可以通过cat命令来实现. 在Linux下用split进行文件分割: ①:指定分割后文件行 ...
- vue table 固定首列和首行
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序
1:访问修饰符 private 同类中 默认 同类 同包 protect 同类 同包 子类 public 同类 ...
- XP下ubuntu双系统安装方法
利用u盘将iso刻录 从u盘启动 连续按alt+f2 进入ubuntu试用 打开终端 输入 sudo umount -l /cdrom sudo umount -l /isodevice 然后安装un ...
- :before和::before的区别
单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素.伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示, ...
- APICloud开发者进阶之路 | txLive模块(直播类)试用分享
本文出自APICloud官方论坛,感谢论坛版主uoaccw的分享 txLive 模块封装了腾讯云直播服务 https://docs.apicloud.com/Client-API/Open-SDK/t ...
- jmeter 之调试
目前知道的调试方法有两种:debug sample .http mirror server debug sample debug sample 的用户界面如下: 如果选择ture则表示打印对应的数据 ...