# from gevent import spawn,monkey;monkey.patch_all()
# from socket import *
# def server(ip,port):
# server = socket(AF_INET, SOCK_STREAM)
# server.bind((ip,port))
# server.listen(5)
#
# while True:
# conn, addr = server.accept()
# print(addr)
# # ....
# # t=Thread(target=talk,args=(conn,add))
# # t.start()
# spawn(talk,conn,addr)
# def talk(conn,addr):
# while True:
# try:
# data=conn.recv(1024)
# if not data:break
# conn.send(data.upper())
# except ConnectionResetError:
# break
# conn.close()
# if __name__ == '__main__':
# server('127.0.0.1',8080)
# --------------------------------------
# 题目 单线程下的 支持并发
# greenlet gevent 关于线程的
### spwan c产卵的意思 引用的这个monkey 必须放在最前
# yield能实现协程,不过实现过程不易于理解,greenlet是在这方面做了改进。
# greenlet 轻量级的并行编程 gevent封装了很多很方便的接口,其中一个就是monkey
# 服务端的
# from gevent import spawn,monkey;monkey.patch_all() ##patch 补丁 必须放在最前面
# from socket import *
# def server(ip,port):
# server=socket(AF_INET,SOCK_STREAM)
# server.bind((ip,port))
# server.listen(3)
# while True:
# conn,addr = server.accept()
# print(addr)
# spawn(talk,conn,addr)
# def talk(conn,addr):
# while True:
# try:
# data = conn.recv(1024)
# if not data: break
# conn.send(data.upper())
# except ConnectionResetError:
# break
# # conn.close()
# if __name__ == '__main__':
# server('127.0.0.1', 8881)
#
# # 客户端的
# from socket import *
# client = socket(AF_INET,SOCK_STREAM)
# client.connect(('127.0.0.1',8881))
# while True:
# client.send('hello'.encode('utf-8'))
# data = client.recv(1024)
# print(data.decode('utf-8')) # # -----------------------------------------
# io 非阻塞服务端的模型
# from socket import *
# import time
# server = socket(AF_INET,SOCK_STREAM)
# server.bind(('127.0.0.1',8888))
# server.listen(3)
# server.setblocking(False) ##本身是阻塞的 但是参数为错 所以为非阻塞的意思
# conn_l =[]
# while True:
# try : ### 主要就是收集链接的任务
# conn,addr = server.accept()
# conn_l.append(conn) ##收到客户端的链接 地址 ,把链接放到列表里
# print(addr)
#
# except BlockingIOError: ##报错异常 没有链接 就会出现 主要的任务就是在收集链接的空闲
# ##去干通信的任务,消除io的等待
# print('没有接收链接,干点别的事')
# del_l=[]
# for conn in conn_l:
# try:
# data = conn.recv(1024)
# if not data:
# conn.close()
# del_l.append(conn)
# continue
# conn.send(data.upper())
# except BlockingIOError:
# pass
# except ConnectionResetError:
# conn.close()
# del_l.append(conn)
# for conn in del_l:
# conn_l.remove(conn) ####注意 原来的列表 不能直接删除元素 但是元列表在完成后 可以循环另一个列表的元素就删除掉
# ---------------------------
# io 多路复用的 引用selet 里面有三个列表 读写x
from socket import *
import time
import select
server = socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8880))
server.listen(2)
server.setblocking(False)## 设置为io复用
read_l=[server,]
print('starting')
while True:
r1,w1,x1 = select.select(read_l,[],[])
## 此时 r1就是read_l
for r in rl:
if r is server:
conn,addr = rl[0].accept()
print(addr)
read_l.append(conn)
else:
try:
data = r.recv(1024)
if not data:
r.close()
read_l.remove(r)
continue
r.send(data.upper())
except ConnectionResetError:
r.close()
read_l.remove(r)

day 36 关于io模型的问题 阻塞 和多路复用的更多相关文章

  1. Python之阻塞IO模型与非阻塞IO模型

    Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...

  2. 36、IO模型与socketserver实现并发

    特别声明本随笔copy于egon(林海峰). 一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronou ...

  3. IO模型之非阻塞IO

    1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...

  4. python并发编程之IO模型 同步 异步 阻塞 非阻塞

    IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...

  5. IO模型,非阻塞IO模型,select实现多路复用

    1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...

  6. python全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  7. 转:IO模型-- 同步和阻塞,异步和非阻塞的区别

    源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...

  8. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  9. {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

    python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...

随机推荐

  1. apiCloud 上拉加载

    api.addEventListener({ name:'scrolltobottom', extra:{threshold:} }, function(ret, err){ //上拉加载时需要加载的 ...

  2. php的抓取

    <?php/** * Created by PhpStorm. * User: s * Date: 2018/11/6 * Time: 18:14 */ include "vendor ...

  3. python time 表示方式

  4. Watto and Mechanism CodeForces - 514C (字典树,哈希)

    大意: 给定字符串集$S$, 每次询问给出字符串$a$, 求$S$中是否存在一个字符串恰好与$a$相差一个字符. 直接建字典树暴力复杂度是$O(n\sqrt{n})$, 也可以用set维护所有哈希值, ...

  5. Pudding Monsters CodeForces - 526F (分治, 双指针)

    大意: n*n棋盘, n个点有怪兽, 求有多少边长为k的正方形内恰好有k只怪兽, 输出k=1,...,n时的答案和. 等价于给定n排列, 对于任意一个长为$k$的区间, 若最大值最小值的差恰好为k, ...

  6. 文件名简体转繁体bat

    @echo off rem 指定文件夹路径 set "fd=D:\下载的图片" rem 0为转换文件名,1为转换文件夹名,2为同时转换文件名和文件夹名 set f=0 rem 0为 ...

  7. java调用url

    1 try { String str; URL u = new URL("https://www.baidu.com"); InputStream is = u.openStrea ...

  8. ThinkPHP5集成JS-SDK实现微信自定义分享功能

    最近开发一个项目,需要将链接分享给好友时能够自定义标题.简介和logo,现将ThinkPHP5集成JS-SDK实现微信自定义分享功能的过程整理成文. 一.准备工作 1.认证的公众号 不管是订阅号还是服 ...

  9. 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备

    安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...

  10. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...