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 readyprint('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 readyif data:print('echoing', repr(data), 'to', conn)conn.send(data) # Hope it won't blockelse: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,datawhile True:events = sel.select() #阻塞,直到events(读,写)for key, mask in events: #key有四个属性,fileobj,fd,envets,data(accept,read等回调函数)callback = key.data #当socket接入时,key.data = acceptcallback(key.fileobj, mask) #accept(key.fileobj,mask) ,key.ffileoj就是sock
import socket import threading import datetime import selectorsclass ChatServer:def __init__(self,ip='127.0.0.1',port=9999):self.sock = socket.socketself.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.datacallback(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()returnmsg = '{}:{}\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()
转载于:https://www.cnblogs.com/harden13/p/9203857.html
Python之io概念相关推荐
- python 文件IO
一.IO.同步IO和异步IO IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等 ...
- Python(十三)IO编程
IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...
- 2021-03-12 Python基础核心概念 变量和简单数据类型
Python基础核心概念 1 变量和简单数据类型 变量命名格式:变量名 = "赋值" 1.1 变量使用规范 使用变量时,需要遵守一些规则.违反这些规则将引发错误. ~变量名只能包含 ...
- 《Python数据挖掘:概念、方法与实践》——1.5节小结
本节书摘来自华章社区<Python数据挖掘:概念.方法与实践>一书中的第1章,第1.5节小结,作者[美] 梅甘·斯夸尔(Megan Squire),更多章节内容可以访问云栖社区" ...
- 《Python数据挖掘:概念、方法与实践》一2.4 小结
本节书摘来自华章出版社<Python数据挖掘:概念.方法与实践>一书中的第2章,第2.4节,作者[美] 梅甘·斯夸尔(Megan Squire),更多章节内容可以访问云栖社区"华 ...
- python异常(概念、捕获、传递、抛出)
python异常(概念.捕获.传递.抛出) 参考文章: (1)python异常(概念.捕获.传递.抛出) (2)https://www.cnblogs.com/xiangribai/p/8594392 ...
- python文件都是脚本吗_脚本语言系列之Python | Python文件IO
Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...
- python 异步io 写excel_python异步IO编程(二)
python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 importasync ...
- python的io模块
open函数是一个工厂函数.根据传入的变量,open函数会进行文件的开启.文件对象的创建与设定,然后返回文件对象.我们来看一下指定不同变量时,open函数具体为我们返回了什么类型的文件对象呢: > ...
最新文章
- Android自定义控件属性的使用
- python教程是什么-Python基础教程_Python入门知识
- Java script第二课
- SystemCenter2012SP1实践(23)私有云的权限设计
- java exception子类_Java异常 Exception类及其子类(实例讲解)
- webpack react项目搭建一:环境
- vue-cli禁用eslint的方式
- MySql-Proxy之多路结果集归并
- arch linux rpm格式,如何在ArchLinux上安装RPM包
- Scalaz(47)- scalaz-stream: 深入了解-Source
- pgAdmin4数据库备份还原
- 开源规则引擎Drools、URule简介
- 解决Java提示“编码GBK的不可映射字符”的问题
- 数说故事携手香港城市大学发表顶级国际论文,并获权威「IEEE TCSS期刊」收录
- 飞桨领航团武汉长沙 | AI如何1秒记笔记,检测你的皮肤状态?
- 激光雷达运动畸变去除方法
- python提取cad坐标_教你一个实用的CAD坐标提取技巧
- 大趋势:科技赋能产业
- H5 架构和原生架构的区别
- 手机通讯录被删除后怎么恢复
热门文章
- Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
- 我在大学主修计算机 英语,托福雅思英语: 我在大学主修计算机
- oracle查询表实际大小,简要分析估算oracle表的大小
- oracle书写高质量sql,干货!SQL性能优化,书写高质量SQL语句
- 计算机二级vf笔试,计算机二级(VF)笔试120.doc
- ios textview间距_iOS 设置TextView控件内容行间距
- Javascript JSON 序列化和反序列化
- dropout理解(二)
- 形而上者谓之道,形而下者谓之器
- 字节跳动攻城狮: 我整理了很久的Python面试指南,请查收!