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次方).操作系统的核心 ...
随机推荐
- IDEA2017 配置Maven
配置本地仓库位置 配置一下Maven的本地仓库路径,首先找到解压Maven的目录,找到conf -> settings.xml这个配置文件打开. 打开settings.xml 配置文件,选一个本 ...
- vue2.0:(八)、外卖App弹窗部分知识点总结
本篇文章是对外卖App弹窗部分知识点的总结. 知识点一:如何从接口取出不同的图片. 答: 1.header.vue: 代码: <ul v-if="seller.supports&quo ...
- nmap扫描开放端口
nmap 192.168.1.1 -p1-65535 指定端口范围使用-p参数,如果不指定要扫描的端口,Nmap默认扫描从1到1024再加上nmap-services列出的端口 nmap-servi ...
- Dom EVENT对象
Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! 一:测试按键 function which ...
- JMeter进行压力测试
一.jmeter的安装 1.从 http://jmeter.apache.org/download_jmeter.cgi 下载jmeter(图1正中间的apache-jmeter-2.13.tg ...
- selenium +python之Page Obiect设计模式
PageObject是selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现对界面交互细节的封装,这样可以使测试案例更关注于业务而非界面细节,从而提高测试案例的可读性. 1.认识Page ...
- 通过CMD命令行创建和使用Android 模拟器 AVD
进行Android APP测试时,若手持android手机设备稀少的情况下,我们可以通过创建Android模拟器AVD来代替模拟android手机设备,本文就具体介绍如何创建和使用AVD. 1.创建A ...
- BZOJ 4242: 水壶 Kruskal+BFS
4242: 水壶 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 427 Solved: 112[Submit][Status][Discuss] D ...
- windows10下安装TensorFlow Object Detection API
由于官方的文件都是在乌班图和mac系统下的,就上网搜了以下. 按照下边这个博客安装成功了 https://blog.csdn.net/qq_28019591/article/details/82023 ...
- 字符串的驻留(String Interning)
http://www.cnblogs.com/artech/archive/2007/03/04/663728.html 关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大 ...