# 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. 『Python』setup.py简介

    setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...

  2. 【Java】【2】String和List相互转换

    正文: 1,String转List //常见的为逗号分隔 String str = "a,b,c"; List<String> list1 = Arrays.asLis ...

  3. CRM UI 打印PDF

    这是项目上看到的绝技^_^ 1.画SF.这步就不说了 2.确定参数,写SF打印PDF函数 FUNCTION zsrv_print_to_pdf . *"------------------- ...

  4. 杂记-格式化Date默认格式,日期加一天,jstl判断字符类型,ajax模拟from表单后台跳转页面,jstl访问数据库并在页面显示

    1.格式化Date默认格式 String str="Sun Oct 08 22:36:45 CST 2017"; SimpleDateFormat sdf = new Simple ...

  5. HttpClient4 警告: Invalid cookie header 的问题解决(转)

    原文地址:HttpClient4 警告: Invalid cookie header 的问题解决 最近使用HttpClient4的时候出现如下警告信息 org.apache.http.client.p ...

  6. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient区别

    在使用服务发现的时候有两种注解, 一种为@EnableDiscoveryClient, 一种为@EnableEurekaClient, 用法上基本一致,下文是从stackoverflow上面找到的对这 ...

  7. IDEA Activiti Designer插件---actiBPM汉字乱码问题

    1.找到IDEA的安装目录 2.用编辑器打开,在文件末尾添加 -Dfile.encoding=UTF-8

  8. 一、集合框架(HashMap和Hashtable的区别)

    一.HashMap和Hashtable 都实现了Map接口,都是以key-value形式保存数据. 区别一: HashMap可以存放null Hashtable不能存放null 区别二: HashMa ...

  9. ReactiveCocoa入门教程--第二部分

    翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使 ...

  10. zookeeper 的心跳

    假定:主机 A, B 通过 tcp 连接发送数据,如果拔掉 A 主机的网线,B 是无法感知到的.但是如果 A 定时给 B 发送心跳,则能根据心跳的回复来判断连接的状态. 以 zookeeper 为例: ...