day19-IO多路复用
1、I/O多路复用指:通过一种机制,可监听多个描述符(soket对象)(文件句柄),一旦某个描述符发送编号(一般指读就绪或写就绪),能够通知程序进行相应的读写操作。
2、I/O多路复用方式:select、poll 、epool。
win 只支持select
select:使用for循环,描述符最多1024个
pool:使用for循环实现,对文件描述符没有限制,
epoll:优化了实现方式,不在使用for循环,使用了异步的方式,效率高
2.1 select方式工作原理:
后面的1表示延时等待时间
nginx在内部就是基于epoll来实现的,使用epool+select来监听用户请求
2.2多路复用+socket实现伪并发处理示例
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket
sk1 = socket.socket()
sk1.bind(('127.0.0.1', 8001))
sk1.listen() # sk2 = socket.socket()
# sk2.bind(('127.0.0.1', 8002))
# sk2.listen()
#
# sk3 = socket.socket()
# sk3.bind(('127.0.0.1', 8003))
# sk3.listen() # inputs = [sk1, sk2, sk3, ]
inputs = [sk1, ]
outputs = []
message_dict = {}
import select
while True:
#[sk1,sk2, ],内部自动监听sk1, sk2 两个对象, 一旦某个句柄发生变化,就能感知到
#如果有人连接 sk1
#r_list = [sk1, ]
#如果有人连接sk1发生编号
r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
print("正在监听的socket对象总计:%d" % len(inputs))
print(r_list)
for sk1_or_conn in r_list:
#每一个连接对象
if sk1_or_conn == sk1:
conn, address = sk1_or_conn.accept()
inputs.append(conn)
message_dict[conn] = []
else:
#有老用户发消息了
try:
data_bytes = sk1_or_conn.recv(1024)
# data_str = str(data_bytes, encoding='utf-8')
# sk1_or_conn.sendall(bytes(data_str+'好', encoding='utf-8'))
except Exception as ex:
#用户终止连接
print(ex)
inputs.remove(sk1_or_conn)
else:
#用户正常发送消息
data_str = str(data_bytes, encoding='utf-8')
message_dict[sk1_or_conn].append(data_str)
# sk1_or_conn.sendall(bytes(data_str+'好', encoding='utf-8')) outputs.append(sk1_or_conn)
# conn.sendall(bytes('hello',encoding='utf-8'))
# conn.close() #w_list 仅仅保存了谁给我发过消息
for conn in w_list:
recv_str = message_dict[conn][0]
del message_dict[conn][0]
conn.sendall(bytes(recv_str+'好', encoding='utf-8'))
outputs.remove(conn) for sk1_or_conn in e_list:
inputs.remove(sk1_or_conn) # while True:
# conn, address = sk.accept()
# while True:
# content_bytes = conn.recv(1024)
# content_str = str(content_bytes, encoding='utf-8')
# conn.sendall(bytes(content_str + '好', encoding='utf-8'))
# conn.close()
server
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket obj = socket.socket() obj.connect(('127.0.0.1',8001 )) while True:
inp = input('>>>>>')
obj.sendall(bytes(inp,encoding='utf-8'))
ret = str(obj.recv(1024),encoding='utf-8')
print(ret) #
# content = str(obj.recv(1024),encoding='utf-8')
# print(content)
obj.close()
# #阻塞
# print('等待中')
# ret_bytes = obj.recv(1024) #设置最高多接受的字节数,超过后需要等下次在接受
# print(str(ret_bytes,encoding='utf-8'))
# print('接受完成')
# # obj.close()
# while True:
# inp = input('请输入要发送的内容(q退出)\n >>>')
# if inp == 'q':
# obj.sendall(bytes(inp,encoding='utf-8'))
# break
# else:
# obj.sendall(bytes(inp,encoding='utf-8'))
# ret = str(obj.recv(1024),encoding='utf-8')
# print(ret)
# obj.close()
client
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket
sk1 = socket.socket()
sk1.bind(('127.0.0.1', 8001))
sk1.listen() sk2 = socket.socket()
sk2.bind(('127.0.0.1', 8002))
sk2.listen() sk3 = socket.socket()
sk3.bind(('127.0.0.1', 8003))
sk3.listen() inputs = [sk1, sk2, sk3, ]
import select
while True:
#[sk1,sk2, ],内部自动监听sk1, sk2 两个对象, 一旦某个句柄发生变化,就能感知到
#如果有人连接 sk1
#r_list = [sk1]
r_list, w_list, e_list = select.select(inputs, [], [], 1)
for sk in r_list:
#每一个连接对象
conn, address = sk.accept()
conn.sendall(bytes('hello',encoding='utf-8'))
conn.close() # while True:
# conn, address = sk.accept()
# while True:
# content_bytes = conn.recv(1024)
# content_str = str(content_bytes, encoding='utf-8')
# conn.sendall(bytes(content_str + '好', encoding='utf-8'))
# conn.close()
server-demo2
2.3关于并发
3、初始超线程
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importthreading
importtime defprocess(arg):
time.sleep(1)
print(arg) #foriinrange(10):
#process(i) foriinrange(10):
t=threading.Thread(target=process,args=(i,))
t.start()
demo
4、Soketserver原码解析
原理图
5、初始多线程
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time def process(arg):
time.sleep(1)
print(arg) # for i in range(10):
# process(i) for i in range(10):
t = threading.Thread(target=process, args=(i,))
t.start()
多线程
day19-IO多路复用的更多相关文章
- Python(七)Socket编程、IO多路复用、SocketServer
本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...
- IO多路复用概念性
sellect.poll.epoll三者的区别 先来了解一下什么是进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为为进程的切换,任务切换 ...
- IO多路复用之select总结
1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...
- IO多路复用之poll总结
1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...
- IO多路复用之epoll总结
1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...
- python中的IO多路复用
在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...
- socket的IO多路复用
IO 多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux Linux中的 select,poll, ...
- IO多路复用及ThreadingTCPServer源码阅读
IO多路复用 socket模块是阻塞的,通过socket建立的服务端可以接收多个请求,但只能同时处理一个请求,其他请求都被阻塞.可以通过IO多路复用解决这个问题,socketserver内部使用的就是 ...
- 【知乎网】Linux IO 多路复用 是什么意思?
提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是 ...
- Python自动化之IO多路复用
单线程.多线程和异步对比图 灰色的是阻塞 IO多路复用 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心 ...
随机推荐
- Java并发(二):基础概念
并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方 ...
- js读取excel数据后的时间格式转换
使用xlsx.full.min.js 获取excel的日期数据为:37858: 拿到的整数值是日期距离1900年1月1日的天数,这时需要写一个函数转换: function formatDate(num ...
- 使用java来压缩图片
使用java来压缩图片,简单几句,清清爽爽 使用0.3的压缩比得到的结果如下(从2.8M压缩到268K,且图片的清晰度看不出明显差别): package carlspringtest; import ...
- 一键部署Moodle开源课程管理系统
产品详情 产品介绍Moodle https://moodle.org/ 是一个开源及自由的电子学习软件平台,亦称为课程管理系统.学习管理系统或虚拟学习环境.Moodle 特色异于其他商业线上教学平台, ...
- Autoit3 如何捕足控件
以任务管理器为例,在命令行提示符下输入taskmgr.exe 接下来识别这个窗口上的控件 在AU3 中提供了一个捕捉控件的工具是Au3Info.exe 这里记录了控件的标题,控件的类型,控件的坐标和 ...
- Android中一个关于ListView的奇怪问题
今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置Lis ...
- 2018.4.3 Linux环境变量与变量
环境变量与变量 shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,用户还可以重新定义这些变量. 环境变量可用命令env或set来查询.(DOS环境为set) 环境变量查询与显示 env ...
- Ajax的原理及Django上传组件
title: Ajax的原理及Django上传组件 tags: Django --- Ajax的原理及Django上传组件 Ajax的原理 ajax 是异步JavaScript和xml ajax就是向 ...
- Python 继承实现的原理(继承顺序)
继承顺序 Python3 : 新式类的查找顺序:广度优先 新式类的继承: class A(object): Python2 3 都是了 MRO算法--生成一个列表保存继承顺序表 不找到底部 Pytho ...
- 线程的sleep方法