Python的Tornado框架是一个轻量级的Web框架,采用非阻塞的编程方式实现了高性能的异步处理。在Tornado框架中,最为核心的部分就是协程(Coroutine)异步实现原理,可以帮助我们更加深入了解Tornado框架的底层实现。
什么是协程?
首先,我们需要了解什么是协程。协程是一种用户态线程,不同于操作系统调度线程,协程可自己控制进程中的多个任务的执行,实现高校的并发效果。在Python中,我们通过生成器(Generator)来实现协程的功能。
协程异步实现原理
Tornado框架中所使用的协程是基于generator的,因为generator可以让代码实现函数返回值暂停并继续执行。在Tornado框架中,协程基于装饰器“@coroutine”实现。
async def handler():
result1 = await func1()
result2 = await func2()
return result1 + result2
在这个示例中,我们定义了一个异步协程handler,并且按照顺序执行了两个异步函数func1和func2。我们会发现,当遇到“await”这个关键字时,主进程会在当前执行点暂停,并且将控制权交给其他需要执行的代码,直到异步操作完成后再恢复执行。
同时,在Tornado框架中,我们需要使用IOLoop.run_until_complete()函数来启动协程的执行。这个函数实现了循环所有的异步事件直到协程执行完成并返回结果。因此,在Tornado框架中实现异步操作的原理就是:当遇到“await”关键字时,暂停当前执行,执行其他协程任务,等待异步操作完成,再恢复执行。
示例说明
为了更好地展示协程异步实现原理,我们可以使用Tornado框架中提供的示例代码。其中一个示例是Echo Server,我们来看一下代码:
import asyncio
import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.platform.asyncio import AnyThreadEventLoopPolicy
async def on_message(ws, message):
print('WebSocket received a message: %s' % message)
await ws.write_message('Echo from the server: %s' % message)
class SocketHandler(tornado.websocket.WebSocketHandler):
async def open(self):
print('WebSocket opened')
async def on_message(self, message):
await on_message(self, message)
async def on_close(self):
print('WebSocket closed')
async def make_app():
return tornado.web.Application([
(r'/', SocketHandler),
])
if name == 'main':
asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
app = tornado.ioloop.IOLoop.current().run_sync(make_app)
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在这个示例中,我们定义了一个SocketHandler类,然后分别在open、on_message和on_close三个异步协程函数中实现了WebSocket的开放、消息接收和关闭功能。另外还定义了一个辅助异步函数on_message,用来输出客户端传来的消息并将其返回给客户端。
同时,我们还通过make_app函数来生成一个可以供Tornado运行的Web Application对象。而运行服务的过程则通过监听8888端口来实现。最后,通过IOLoop.start()函数来触发事件循环,开始异步执行。
另一个示例是 Tornado 官方文档中的Coroutine 示例:
from tornado.ioloop import IOLoop
from tornado.gen import coroutine
from tornado.httpclient import AsyncHTTPClient
@coroutine
def coroutine_fetch(url):
http_client = AsyncHTTPClient()
response = yield http_client.fetch(url)
return response
if name == "main":
IOLoop.current().run_sync(lambda: coroutine_fetch('http://www.baidu.com'))
在这个示例中,我们定义了一个异步函数coroutine_fetch,用来获取指定URL地址的信息。从代码中可以看出这个函数中存在yield这个关键字,用来暂停函数的执行并等待异步操作完成,再继续执行。
在主程序中,我们使用IOLoop.current().run_sync()函数对异步函数进行执行,并为其传入了“http://www.baidu.com”这个URL地址,用来获取百度网站的信息。因此,在程序实际运行时,会先执行main函数,并触发异步函数的执行,然后等待异步操作完成后输出结果。
通过以上两个示例,我们可以更加深刻地理解Tornado框架中的协程异步实现原理,并且更好地掌握Tornado框架的底层实现原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单介绍Python的Tornado框架中的协程异步实现原理 - Python技术站