IO多路复用注解
#!/usr/bin/env python
# -*- coding:utf-8 -*- # 客户端
import socket obj = socket.socket()
obj.connect(("127.0.0.1", 8003))
# 如果服务端不accept,阻塞
content = str(obj.recv(1024), encoding="utf-8")
print(content)
obj.close() # 服务器端
import socket
import select sk1 = socket.socket()
sk1.bind(("127.0.0.1", 8003))
sk1.listen(5)
inputs = [sk1, sk2, ]
while True:
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() # send和sendall的区别是sendall里面有一个while循环会把要发送的所有信息都发送出去才返回
# 但是send的话不一定全部发送,发送多少个字节就返回多少个字节
# 程序从上到下执行,执行到select,用1s的时间去系统内核检查是否有发生变化,如果超时了,就出去了,就是执行
# 到select,程序会等1s,如果在1s的时间内没有人来连,那么程序就会继续往下走,如果第0.5s有人来连接,那么
# 程序就会直接往下走,1s是最多的等待时间
#
# 当客户端中止,会给服务端发空数据,select依然能够监听到 2.7
# 3的话用try except # 服务器端 import socket
import select sk1 = socket.socket()
sk1.bind(("127.0.0.1", 8003))
sk1.listen(5)
inputs = [sk1, ]
outputs = []
message_dict = {}
while True:
r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
for sk in r_list:
if sk == sk1:
conn, address = sk.accept()
inputs.append(conn)
message_dict[conn] = []
else:
try:
data_bytes = sk.recv(1024) except Exception as e:
inputs.remove(sk)
else:
data_str = str(data_bytes, encoding="utf-8")
message_dict[sk].append(data_str)
# sk.sendall(bytes(data_str + "hao", encoding="utf-8"))
outputs.append(sk)
for conn in w_list:
recv_str = message_dict[conn][0]
del message_dict[conn][0]
conn.sendall(bytes(recv_str+"hello",encoding="utf-8"))
outputs.remove(conn) # 无论是中止还是control+c,都能用try,except捕捉到
# 如果接受到消息,执行else语句,如果接收不到消息,执行except语句
# w_list保存的是给服务端发消息的客户端,然后你可以发消息给该客户端
# message_dict这里可以用queue来优化
IO多路复用注解的更多相关文章
- 事件驱动模型和异步IO多路复用
事件驱动模型 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程, ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- python学习笔记10--协程、IO、IO多路复用
本节内容 一.协程 1.1.协程概念 1.2.greenlet 1.3.Gevent 1.4.协程之爬虫 1.5.协程之socket 二.论事件驱动与异步IO 三.IO 3.1.概念说明 3.2.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多路复用的系统开销小,系统不 ...
随机推荐
- QT出现应用程序无法正常启动0xc000007b的错误
最近做了一个成绩管理系统,打包好后,运行他的exe可执行文件时,出现了如下图的错误提示: 在网上查阅了很多资料,其中有篇文章给了我很大的启示和帮助,文章地址http://www.cnblogs.com ...
- C++模板、.vimrc和一些Linux配置
C++模板 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...
- BZOJ4643 卡常大水题 【Tarjan】
题目分析: 给所有边按A排序,依次加入再按B递增排序,势能分析可以发现是O(n^4)的 代码: #include<bits/stdc++.h> using namespace std; ; ...
- Maze HDU - 4035(期望dp)
When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...
- Vue 闪现解决
场景介绍:页面加载数据时,原始代码{{}}闪现. 问题代码 <div class="root"> <ul v-for="user in userProf ...
- Windows 10 2016 LTS版本下载与激活
Windows 10 2016 LTS版是针对企业用户推出的长期支持版本,有如下2个优点:1.不会被强制升级.2.去掉小娜,应用商店等不常用的功能,系统相对简洁. 安装文件下载地址如下(x86/x64 ...
- 前端神器之jquery
jquery介绍 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. ...
- 类型和原生函数及类型转换(三:终结js类型转换)
Number() parseInt() parseFloat() Boolean() String() toString() 一.显式类型转换 -------Number()函数把对象的值转换为数字. ...
- django - 总结 - redis缓存
八.redis 补充- 操作 - 增删改查 对字典,重新设计结构,增删改查. hmset keys hget scan_iter hgetall import redis import j ...
- CSS布局-flex布局入门教程
前言 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能. 查询兼容 F ...