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多路复用的更多相关文章

  1. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

  2. IO多路复用概念性

    sellect.poll.epoll三者的区别 先来了解一下什么是进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行,这种行为为进程的切换,任务切换 ...

  3. IO多路复用之select总结

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  4. IO多路复用之poll总结

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  5. IO多路复用之epoll总结

    1.基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本.相对于select和poll来说,epoll更加灵活,没有描述符限制.epoll使用一个文件描述符管理多个描述 ...

  6. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  7. socket的IO多路复用

    IO 多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux Linux中的 select,poll, ...

  8. IO多路复用及ThreadingTCPServer源码阅读

    IO多路复用 socket模块是阻塞的,通过socket建立的服务端可以接收多个请求,但只能同时处理一个请求,其他请求都被阻塞.可以通过IO多路复用解决这个问题,socketserver内部使用的就是 ...

  9. 【知乎网】Linux IO 多路复用 是什么意思?

    提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是 ...

  10. Python自动化之IO多路复用

    单线程.多线程和异步对比图 灰色的是阻塞 IO多路复用 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心 ...

随机推荐

  1. 移动端之js控制rem,适配字体

    方法一:设置fontsize 按照iphone 5的适配  1em=10px    适配320 // “()()”表示自执行函数 (function (doc, win) { var docEl = ...

  2. Reset CSS 页面初始化css

    CSS 初始化样式(Reset CSS 官网提供): /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: non ...

  3. HttpServeletRequest

    一.HttpServeletRequest 接口(javax.servlet.http) 定义:public interface HttpServletRequestextends ServletRe ...

  4. web APP到底和跨平台APP开发有什么区别?

    什么是web app? WebApp是指基于Web的系统和应用,其作用是向广大的最终用户发布一组复杂的内容和功能. 说的浅显易懂点儿就是因为移动互联网特别火爆,很多企业公司也都想拥有一个属于自己的ap ...

  5. 【extjs6学习笔记】1.7 初始:加载第三方库

    https://www.sencha.com/blog/integrating-ext-js-with-3rd-party-libraries-2/ Introduction Ext JS provi ...

  6. linux下设置SSH无密码登录

    ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh ...

  7. 文末两大福利 | 微软Inspire大会全接触:微软发布Microsoft 365......

    在7月11日举行的“Inspire年度合作伙伴大会”上 ,微软首席执行官萨提亚·纳德拉发布了Microsoft 365. 它包含了:Office 365.Windows 10和企业移动性+安全性(En ...

  8. Python学习——1113

    在命令界面直接输入python,进入交互模式,相当于启动了Python解释器,需要一行一行的输入,输入一行,执行一行. 在命令界面直接运行.py文件,相当于直接启动了Python解释器,一次性把.py ...

  9. ASUS主板 Type C 接口无效问题

    修改UEFI设置,把 USB TYPE C POWER SWITCH 改成启用

  10. MFC:AfxSetResourceHandle

    AfxGetResourceHandle用于获取当前资源模块句柄. 而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄,一般在InitInstance()里调用.