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.一句话说明什么是线程:协程是一种用户态的轻量级线程,协程一定是在单线程运行的. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和 ...
随机推荐
- 深入理解Java虚拟机阅读心得(二)
垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有 ...
- npm的一些常用命令(在国内,建议使用cnpm,在淘宝镜像里面下载就行)
npm的一些常用命令(在国内,npm操作可能会比较慢,建议使用cnpm,在淘宝镜像里面下载就行,用法和npm一样) cnpm安装地址,直接安装 npm install cnpm -g --regist ...
- Ackerman
Ackerman 递归算法 一 . 问题描述及分析 图1 二 . 代码实现 package other; import java.io.BufferedWriter; import java.io.F ...
- Torch功能点记录
1. Numpy矩阵转换Tensor: tensor_num = torch.from_numpy(numpy_arr)
- webpack实现开发、测试、生产等环境的打包切换
使用webpack构建的工程,在开发过程中不同环境的配置不同,在各种环境的打包切换过程中需要手动修改相关配置达到预期目的.但是每次都手动修改会比较麻烦,本文简单介绍如何通过对webpack进行配置,实 ...
- nginx Provisional headers are shown
项目用的Nginx做的代理,重启电脑后,重启项目和Nginx 浏览器报 Provisional headers are shown 解决: host文件添加: 127.0.0.1 cleaner ...
- 04_ switch 练习 _ 你及格了吗
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- document.querySelectorAll() 兼容 IE6
不多说,直接上代码 // 使用 css 选择器获取元素对象 兼容性封装 Test Already. function getElementsByCss(cssStr){ if(document.que ...
- [LeetCode] Robot Room Cleaner 扫地机器人
Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...
- virtualenvwrapper虚拟环境
之前学习过python的虚拟环境virtualenv,而virtualenvwrapper这个软件包可以让我们管理虚拟环境变得更加简单,不用再跑到某个目录下通过virtualenv来创建虚拟环境,并且 ...