"""
同步,异步:
强调结果,调用者最终是否得到想要的结构
阻塞非阻塞:
强调时间是否等待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概念相关推荐

  1. python 文件IO

    一.IO.同步IO和异步IO IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等 ...

  2. Python(十三)IO编程

    IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...

  3. 2021-03-12 Python基础核心概念 变量和简单数据类型

    Python基础核心概念 1 变量和简单数据类型 变量命名格式:变量名 = "赋值" 1.1 变量使用规范 使用变量时,需要遵守一些规则.违反这些规则将引发错误. ~变量名只能包含 ...

  4. 《Python数据挖掘:概念、方法与实践》——1.5节小结

    本节书摘来自华章社区<Python数据挖掘:概念.方法与实践>一书中的第1章,第1.5节小结,作者[美] 梅甘·斯夸尔(Megan Squire),更多章节内容可以访问云栖社区" ...

  5. 《Python数据挖掘:概念、方法与实践》一2.4 小结

    本节书摘来自华章出版社<Python数据挖掘:概念.方法与实践>一书中的第2章,第2.4节,作者[美] 梅甘·斯夸尔(Megan Squire),更多章节内容可以访问云栖社区"华 ...

  6. python异常(概念、捕获、传递、抛出)

    python异常(概念.捕获.传递.抛出) 参考文章: (1)python异常(概念.捕获.传递.抛出) (2)https://www.cnblogs.com/xiangribai/p/8594392 ...

  7. python文件都是脚本吗_脚本语言系列之Python | Python文件IO

    Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...

  8. python 异步io 写excel_python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 importasync ...

  9. python的io模块

    open函数是一个工厂函数.根据传入的变量,open函数会进行文件的开启.文件对象的创建与设定,然后返回文件对象.我们来看一下指定不同变量时,open函数具体为我们返回了什么类型的文件对象呢: > ...

最新文章

  1. Android自定义控件属性的使用
  2. python教程是什么-Python基础教程_Python入门知识
  3. Java script第二课
  4. SystemCenter2012SP1实践(23)私有云的权限设计
  5. java exception子类_Java异常 Exception类及其子类(实例讲解)
  6. webpack react项目搭建一:环境
  7. vue-cli禁用eslint的方式
  8. MySql-Proxy之多路结果集归并
  9. arch linux rpm格式,如何在ArchLinux上安装RPM包
  10. Scalaz(47)- scalaz-stream: 深入了解-Source
  11. pgAdmin4数据库备份还原
  12. 开源规则引擎Drools、URule简介
  13. 解决Java提示“编码GBK的不可映射字符”的问题
  14. 数说故事携手香港城市大学发表顶级国际论文,并获权威「IEEE TCSS期刊」收录
  15. 飞桨领航团武汉长沙 | AI如何1秒记笔记,检测你的皮肤状态?
  16. 激光雷达运动畸变去除方法
  17. python提取cad坐标_教你一个实用的CAD坐标提取技巧
  18. 大趋势:科技赋能产业
  19. H5 架构和原生架构的区别
  20. 手机通讯录被删除后怎么恢复

热门文章

  1. Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
  2. 我在大学主修计算机 英语,托福雅思英语: 我在大学主修计算机
  3. oracle查询表实际大小,简要分析估算oracle表的大小
  4. oracle书写高质量sql,干货!SQL性能优化,书写高质量SQL语句
  5. 计算机二级vf笔试,计算机二级(VF)笔试120.doc
  6. ios textview间距_iOS 设置TextView控件内容行间距
  7. Javascript JSON 序列化和反序列化
  8. dropout理解(二)
  9. 形而上者谓之道,形而下者谓之器
  10. 字节跳动攻城狮: 我整理了很久的Python面试指南,请查收!