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. NIO基础之Buffer

    java.io 核心概念是流,即面向流的编程,在java中一个流只能是输入流或者输出流,不能同时具有两个概念. java.nio核心是 selector.Channel.Buffer ,是面向缓冲区( ...

  2. 《超实用的Node.js代码段》连载一:获取Buffer对象字节长度

    我们知道Node.js框架下的Buffer对象能够对二进制数据提供很好的支持,那么获取一个Buffer对象真实的字节长度则是必须要用到的功能了.Node.js框架为开发人员提供了一个Buffer.by ...

  3. jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作

    jquery.page.js使用demo HTML代码 <div class="result"> <div class="tcdPageCode&quo ...

  4. kubernetes-jenkins CI/CD平台

    软件环境:Jenkins + Kubernetes + Git + Maven + Harbor 发布流程设计 工作流程:手动/自动构建-> Jenkins 调度K8S API->动态生成 ...

  5. BCB:使用CppWebBrowser判断网页加载完成

    void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *U ...

  6. Google「Game Builder」:不懂编程,也能开发 3D 游戏

    简评: 之前微软曾推出过「Kodu Game Lab」,它可以让完全没有编程经验的人通过简单的步骤打造属于自己的游戏.无独有偶,Google 最近在 Steam 也推出了类似的程序「Game Buil ...

  7. Web前端 优化方案

    1.减少Http请求  在一个页面中图片,CSS,JS可能N个,如果每个资源都去请求一次服务器的话,那么服务器就会为每个资源开一个线程来完成,这样的话对服务器的压力就很大了.所以解决的方法就是合并资源 ...

  8. d3网址

    官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...

  9. STL容器之Array[转]

    转自https://blog.csdn.net/sin_geek/article/details/51067874 作者 Sin_Geek 简介 array在头文件<array> 中定义 ...

  10. CF-1143D. The Beatles

    题意:有间隔为k的n个点在数轴上,下标为 \(1,k+1, 2*k+1,\cdots (n-1)*k+1\) 首尾相接.设起点为s,步长为L,而现在只知道s距离最近的点的距离为a,和(s+L)距离最近 ...