day 36 关于io模型的问题 阻塞 和多路复用
# 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模型的问题 阻塞 和多路复用的更多相关文章
- Python之阻塞IO模型与非阻塞IO模型
Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...
- 36、IO模型与socketserver实现并发
特别声明本随笔copy于egon(林海峰). 一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronou ...
- IO模型之非阻塞IO
1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...
- python并发编程之IO模型 同步 异步 阻塞 非阻塞
IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...
- IO模型,非阻塞IO模型,select实现多路复用
1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...
- python全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- 转:IO模型-- 同步和阻塞,异步和非阻塞的区别
源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- {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) 五 ...
随机推荐
- Django多表查询练习题
#一 model表:from django.db import models # Create your models here. class Teacher(models.Model): tid=m ...
- SVN入门使用
1.安装客户端:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7 2.安装服务器:Setup-Subversion-1.8.5.msi 下载地址:http://sou ...
- MySQL事务(二)
一.事务的隔离级别/锁问题 基本的介绍: 当我们的mysql表,被多个线程或者客户端同时操作时,mysql提供一种机制,可以让不同的事务在操作数据时,具有隔离性. 锁是计算机协调多个进程或线程并发访问 ...
- Alyona and a tree CodeForces - 739B (线段树合并)
大意: 给定有根树, 每个点$x$有权值$a_x$, 对于每个点$x$, 求出$x$子树内所有点$y$, 需要满足$dist(x,y)<=a_y$. 刚开始想错了, 直接打线段树合并了..... ...
- Oracle 视图和索引
一.视图 1.什么是视图[View] (1)视图是一种虚表 (2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表 (3)向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起 ...
- leetcode-algorithms-19 Remove Nth Node From End of List
leetcode-algorithms-19 Remove Nth Node From End of List Given a linked list, remove the n-th node fr ...
- php分页、正则验证
//原装分页<?phpheader("Content-type:text/html;Charset=utf8"); $link=mysqli_connect("lo ...
- docker 系列之 docker安装
Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...
- 本地仓库有jar包maven依然报错的原因
本地Maven仓库有所需jar包依然报错,missing……………… 既然有这个jar包为什么还会报错呢? 找到本地仓库后发现里面有一个_remote.repositories文件 问题在_remot ...
- Java序列化的作用和反序列化
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...