异步io和协程

常见的异步io模块asyncio、gevent、twisted、tornado

核心技术为select()和协程

异步io请求的本质则是【非阻塞Socket】+【IO多路复用】

协程在这里不是一个必须使用的技术,在使用select()事件驱动循环本身就可以达到单线程异步的效果

io协程在遇到阻塞时进行切换,其实现需要依赖select()事件循环进行切换

协程本质是一种上下文切换技术,通过生成器yield记录状态的特性来实现

r,w,e = select.select([rlist],[wlist],[error],timeout)
select:采用事件轮询方式,即在while True下不断轮询所有的socket,
某个socket有数据返回时通知用户进程,最大轮询事件为1024,可以跨平台,水平触发
poll:方式相同,没有最大轮询事件数量限制
epoll:方式不同,比如100个连接,有两个活跃了,epoll会告诉用户这两个两个活跃了,直接取就ok了,而select是循环一遍。

select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO
的web server性能更好,可能延迟还更大。

 1 import socket,select
 2
 3 socket_list = [
 4     (‘www.baidu.com‘,80),
 5     (‘202.89.233.100‘,80),
 6     (‘101.37.225.65‘,80),
 7 ]
 8 soc_list = []
 9 conn_list=[]
10 for s in socket_list:
11     c = socket.socket()
12     c.setblocking(False)
13     try:
14         c.connect(s)
15     except Exception as e:
16         pass
17     soc_list.append(c)
18     conn_list.append(c)
19 print(soc_list)
20 while True:
21     r,w,error = select.select(soc_list,conn_list,[])
22     for i in soc_list:
23         try:
24             while True:
25                 data = i.sock.recv(8096)
26                 print(i)
27                 if not data:
28                     soc_list.remove(i)
29         except Exception as e:
30             pass
31
32     for i in conn_list:
33         i.sendall("""GET /index HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n""")
34         conn_list.remove(i)

异步io客户端

原文地址:https://www.cnblogs.com/cx59244405/p/8464945.html

时间: 2024-10-29 04:20:49

异步io和协程的相关文章

异步IO(协程,消息循环队列)

同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其他的事直到IO操作完 成了再回来进行. 消息模型:当遇到IO操作时,代码只负责发出IO请求,不等待IO结果,然后直接结束本轮消息处理,进入下一轮 消息处理过程.当IO操作完成后,将收到一条"IO完成"的消息,处理该消息时就可以直接获取IO操作结果. 子程序调用总是一个入口,一次返回,调用顺

Python异步IO之协程(一):从yield from到async的使用

引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中均存在一些缺点.因此,我们引出了协程. Tips 欲看完整代码请见:我的GitHub 为什么需要协程?首先,我们需要知道同步和异步是什么东东,不知道的看详解.简单来说:[同步]:就是发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,“调用者”需要一直等待该“调用”结束,才能进行下一步工作.

Python异步IO之协程(二):使用asyncio的不同方法实现协程

引言:在上一章中我们介绍了从yield from的来源到async的使用,并在最后以asyncio.wait()方法实现协程,下面我们通过不同控制结构来实现协程,让我们一起来看看他们的不同作用吧- 在多个协程中的线性控制流很容易通过内置的关键词await来管理.使用asyncio模块中的方法可以实现更多复杂的结构,它可以并发地完成多个协程. 一.asyncio.wait() 你可以将一个操作分成多个部分并分开执行,而wait(tasks)可以被用于中断任务集合(tasks)中的某个被事件循环轮询

关于C10K、异步回调、协程、同步阻塞

最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的了解就好. C10K的由来 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合.互联网还不够普及,用户也不多.一台服务器同时在线100个用户估计 在当时已经算是大型应用了.所以并不存在什么C10K的难题.互联网的爆发期应该是在www网站,浏览器,雅虎出现后.最早的互联网称之为Web1.0, 互联网大部分的使用场景是下载一个Html页面,用户在浏览器中

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L

网络IO解决方案 — 协程框架的实现

协程这个概念很久了,好多程序员是实现过这个组件的,网上关于协程的文章,博客,论坛都是汗牛充栋,在知乎,github上面也有很多大牛写了关于协程的心得体会.突发奇想,我也来实现一个这样的组件,并测试了一下性能.借鉴了很多大牛的思想,阅读了很多大牛的代码.于是把整个思考过程写下来.实现代码 https://github.com/wangbojing/NtyCo 代码简单易读,如果在你的项目中,NtyCo能够为你解决些许工程问题,那就荣幸之至. 下面将部分的NtyCo的代码贴出来. NtyCo 支持多

Python--Demo18--异步IO之协程

协程: 使用一个线程来实现异步操作的.它相对于多线程执行效率高,不存在线程切换:此外协程不牵扯多线程中锁的机制,所以不必考虑加锁这些复杂操作. 协程是通过generator来实现的,就是yield关键字和send()函数的使用. 生成器的yield关键字: yield关键字可以将值(信息)返回,同时在信息返回后使程序停留在当前行. >>> def test(): ... number=1 ... while True: ... number*=2 ... yield number ...

python-gevent模块(自动切换io的协程)

import gevent def foo(): print("Running in foo") gevent.sleep(2) print("Explicit context switch to foo again") def bar(): print("Explicit context to bar") gevent.sleep(1 ) print("Implicit context switch back to bar"

104.协程

协程 定义:为非抢占式多任务产生子程序的计算机程序组件 协程允许不同入口点在不同位置暂停或开始执行程序 从技术角度讲,协程是可以暂停的函数,或直接理解为生成器 本质是单线程,相比多线程,可以及其节省系统资源 协程函数运行结束后,如果还执行.send()就会报错StopIteration yield即使返回值,也是可以是下一步的参数输入值 def xc(): print("协程开始") #yield既是出口,也是入口 a = yield print("协程从新开始:"