python实现异步的几种方式,python异步是什么意思
我们知道,CPU比磁盘、网络等IO快很多。在一个线程中,CPU执行代码的速度极快。但是,一旦遇到IO操作,比如读写文件和发送网络数据,就需要等待IO操作完成后再进行下一步。这种情况称为同步IO。
在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码不能被当前线程执行。
因为一个IO操作阻塞了当前线程,其他代码无法执行,所以必须使用多线程或者多进程并发执行代码,服务多个用户。每个用户将被分配一个线程。如果IO导致线程挂起,其他用户的线程不会受到影响。
多线程多进程模型虽然解决了并发问题,但是系统不能无限制的添加线程。因为系统切换线程的开销也很大,一旦线程数量过大,CPU的时间都花在线程切换上,真正运行代码的时间就少了,导致性能严重下降。
因为我们要解决的问题是CPU的高速执行能力和IO设备的龟速严重不匹配,多线程多进程只是解决这个问题的一种方式。
解决IO问题的另一种方法是异步IO。当一个代码需要执行一个耗时的IO操作时,它只发出IO指令,不等待IO结果,然后去执行其他代码。一段时间后,当IO返回结果时,会通知CPU进行处理。
1) aiohttp
AsyncIO可以实现单线程并发IO操作。如果只是用在客户端,发挥不了多大威力。如果在服务器端使用asyncio,比如Web服务器,由于HTTP连接是一个io操作,所以可以用单线程协程实现多用户高并发支持。
Asyncio实现了TCP、UDP、SSL等协议,而aiohttp是基于asyncio的http框架。
安装:
pip安装aiohttp示例:
使用aiohttp构建web服务
进口异步
从aiohttp导入web
异步定义索引(请求):
等待异步睡眠(0.5)
返回web。响应(body=Index )
异步定义hello(请求):
等待异步睡眠(0.5)
text=hello,%s % request.match_info[name]
返回web。response(body=text . encode( utf-8 ),content_type=text/html )
异步定义初始化(循环):
app=web。应用程序(循环=循环)
app.router.add_route(GET ,/,index)
app.router.add_route(GET ,/hello/{name} ,hello)
SRV=await loop . create _ server(app . make _ handler(), 0.0.0.0 ,6000)
打印(“服务器开始于http://0.0.0.0:6000”)
返回srv
loop=asyncio.get_event_loop()
loop . run _ until _ complete(init(loop))
Loop.run_forever()此时可以通过地址访问这个web服务。
注意aiohttp的初始化函数init()也是一个协程,loop.create_server()使用asyncio创建TCP服务。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。