Python IO多路复用select模块
多路复用的分析实例:服务端、客户端
#服务端配置
from socket import *
import time
import select server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)
'''
select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
当任何一个socket中的数据准备好了,select就会返回,会从操作系统将数据拷贝到应用程序中 1.select.select(read_list,write_list,[],5)是由应用程序发起的,发送给操作系统,让操作系统去找有数据的套接字socket
5:可以不用写,意思是5秒如果有数据连接进来会执行,如果没有回执行下一行代码(不用写是因为如果没数据执行下面的也没意义,
能执行下面的代码,肯定是上面有数据过来已经成功建立了连接) 重点:是没有数据过来才阻塞
有数据过来会一直运行,不会阻塞 2.异步IO:
发送之后不用管,会自动把结果发给你,发一个给操作系统就不用管了(用于爬虫,效率最高) '''
data_dic={} #设置一个空字典,目的是用于将conn:data 一一绑定
read_list=[server,] #放和收消息有关的套接字 conn.recv() server.accept(),是被检测的一些套接字
write_list=[] #send写数据,存放建立好的一些套接字服务端
print('start....')
while True:
#select执行的返回结果是维护的列表里面,哪个有数据过来了
rl,wl,xl=select.select(read_list,write_list,[]) #这里select在指定的时间段内不停的去问操作系统要数据,如果没有数据就会执行下面一行代码
print(read_list) #read_list=[server,conn1,conn2,conn3,conn4]
print(rl,len(rl)) #重点理解:上面循环每次得到r1只时包换操作系统询问到的有数据的套接字[conn1,conn2..]
#r1就是select返回的有
# print('read_list:%s rl:%s wl:%s ' %(len(read_list),len(rl),len(wl))) #rl=[conn1,conn2] #注意: #1.刚开始循环r1里面只有server,read_list=[server]里面也只有server,此时r1和read_list里面内筒一样
#2.刚开始read_list=[server,conn] server是负责建立新连接的,conn是负责收消息的 #3.当服务端accept()收到新的连接并加入到read_list[server,conn]里面,
# 问到结果之后此时 rl,wl,xl=select.select(read_list,write_list,[]),得到的r1里面只包含已经有数据过来的连接 #read_list里面的连接请求不会取走,只要有数据就不会阻塞,阻塞的情况是列表里面没有数据拿
#r1里面去依次for循环取数据,如果是server套接字对象就是accept(),否则就负责recv()数据
for sk in rl: #初始状态read_list里面放的的是server套接字,需要执行accept操作
if sk == server: #判断for循环,首先只有server服务端负责accept()接收
conn,addr=sk.accept()
read_list.append(conn) #后面并发的数量多了时要往read_list里面放一些有数据的套接字对象
else:
# sk.recv(1024)
# print(sk)
data=sk.recv(1024)
write_list.append(sk) #有消息往外回所以加进去了
data_dic[sk]=data #制作字典绑定send的对象和数据:格式为发送的对象conn:对应发送的数据 data #因为conn占用了应用程序的资源、对应操作系统还有维持连接 for sk in wl:
sk.send(data_dic[sk].upper()) #根据字典里面对应的socket套接字对象拿到,拿到
data_dic.pop(sk) #发完之后字典里面就没必要存放消息了,所以就回收
write_list.remove(sk) #回完之后没有了,所以就删除 #write_list还没满的情况下会返回w1
#read_list占应用程序的资源 # 因为conn占用了应用程序的资源、对应操作系统还要维持链接
#客户端配置
from socket import *
import os client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080)) while True:
msg=input('输入要操作的命令:')
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
Python IO多路复用select模块的更多相关文章
- 第五十五节,IO多路复用select模块加socket模块,伪多线并发
IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...
- python学习之-- IO多路复用 select模块
python I/O多路复用包括3个模块,上一篇已经说过概念,这里我使用的是select模块实现一个ftp并发 服务器端核心代码: import socket,select import queue, ...
- Python——IO多路复用之select模块epoll方法
Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_c ...
- Python——IO多路复用之select模块poll方法
Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...
- Python——IO多路复用之select模块select方法
Python——IO多路复用之select模块select方法 使用select模块的select方法实现Python——IO多路复用 实现同时将终端输入的文本以及客户端传输的文本写入文本文件中: w ...
- Python实战之IO多路复用select的详细简单练习
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select 它通过一个select()系统调用来 ...
- python中的select模块
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...
- Python自动化开发 - select模块
介绍: IO-多路复用:监听多个socker对象是否有变化,包括可读.可写.发送错误 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个 ...
- 深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...
随机推荐
- 使用SharePreferences存取数据(慕课笔记 )
0.视频地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取数据: public class MainActivity extends A ...
- Python +selenium之集成测试报告与unittest单元测试
随着软件不断迭代,对应的功能也会越来越多,从而对应的测试用例也会呈指数增长.如果将全部的测试用例集成在一个文件中就会显得特别的臃肿而且维护成本也会很高. 一个很好的放大就是将这些测试yo你给里按照功能 ...
- 爬去酷狗top500的数据
import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...
- 为了少点击几次,自己写了一个Chrome插件
缘由 chrome应用商店有三款二维码插件,自己一直使用的第一款.这三款插件有且只有一个功能就是生成当前页面的URL的二维码. 其实这个功能基本上满足了需要移动端开发在微信里打开页面进行调试的情况. ...
- Erlang程序设计(第2版)读书笔记(一)
正如<代码的未来>中所说,为了充分利用多核,并发变成将成为未来发展的趋势,对于并发编程的支持,Erlang确实是不二之选,Erlang在国内仍然较为小众,经典书籍相对也要少很多,最终选择了 ...
- UVA 11732 strcmp() Anyone (Trie+链表)
先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2, 两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次. 因 ...
- Android(java)学习笔记108:Android的Junit调试
1. Android的Junit调试: 编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一 ...
- 在ubuntu中用命令安装iperf
Iperf的安装要换成阿里的源 sudo add-apt-repository "ppa:patrickdk/general-lucid" sudo apt-get update ...
- Vue路由跳转到新页面时 默认在页面最底部 而不是最顶部 的解决
今天碰到一个问题 vue路由跳转到新的页面时会直接显示页面最底部 正常情况下是显示的最顶部的 而且好多路由中不是全部都是这种情况 折腾好长时间也没解决 最后在网上找到了解决办法 其实原理很 ...
- [转载]matlab图像处理为什么要归一化和如何归一化
matlab图像处理为什么要归一化和如何归一化,一.为什么归一化1. 基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响.也就是转换成唯一的标准形式以抵抗仿射变 ...