简单介绍Python的Tornado框架中的协程异步实现原理

yizhihongxing

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技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python使用Beautiful Soup实现解析网页

    Python使用Beautiful Soup实现解析网页 本文将介绍如何使用Python的Beautiful Soup库解析网页。我们将使用Beautiful Soup库解析HTML文档,并使用find()和find_all()方法查找元素。 解析HTML文档 以下是一个示例代码,演示如何使用Python的Beautiful Soup库解析HTML文档: f…

    python 2023年5月15日
    00
  • python之如何实现延迟操作

    下面是Python中如何实现延迟操作的攻略: 1. 使用time.sleep实现简单延迟 time库是Python自带的一个时间操作库,其中time.sleep()函数可以实现程序的暂停,从而实现延迟操作。下面是一个示例代码: import time print("开始延迟操作") time.sleep(5) # 延迟5秒 print(&…

    python 2023年6月2日
    00
  • 使用成对的输入文件和多个输出文件编写 bash 或 python for 循环

    【问题标题】:Writing a bash or python for loop with paired input files and multiple output files使用成对的输入文件和多个输出文件编写 bash 或 python for 循环 【发布时间】:2023-04-06 04:38:01 【问题描述】: 我正在研究用于分析 RNA-s…

    Python开发 2023年4月7日
    00
  • python生成遍历暴力破解密码的方法

    生成遍历暴力破解密码的方法是指使用Python编程语言生成多个密码组合并逐一尝试的方法,以便找出给定的秘密密码。下面是一些步骤和示例代码,用于演示如何实现这一方法: 导入必要的库 要使用Python进行暴力破解密码,需要使用一些标准库和第三方库,其中最重要的是“itertools”库和“string”库。这些库可以通过导入语句引入Python程序中,如下所示…

    python 2023年6月3日
    00
  • python的re正则表达式实例代码

    以下是详细讲解“Python的re正则表达式实例代码”的完整攻略,包括正则表达式的语法和两个示例说明。 正则表达式语法 正则表达式是由普通和元字符组成的,用来描述文本模式。下面是一些常用的正则表达式元字符: .:匹配意字符。 *:匹配前面的字符0次或多次。 +:匹配前面的字符1次或多次。 ?:匹配前面的字符0次或1次。 |:匹配多个正则表达式中的任意一个。 …

    python 2023年5月14日
    00
  • python PIL和CV对 图片的读取,显示,裁剪,保存实现方法

    下面我将为您讲解如何使用Python PIL和CV对图片进行读取、显示、裁剪和保存。 图片读取 使用PIL库可以轻松读取图片,只需要使用Image.open()函数并传入图片路径即可。 from PIL import Image img = Image.open("example.jpg") 使用cv2库也可以读取图片,只需要使用cv2.…

    python 2023年5月18日
    00
  • Python如何匹配文本并在其上一行追加文本

    在Python中匹配文本并在其上一行追加文本,可以通过以下步骤实现: 读取文本文件中的每一行内容,将每一行存储在列表中。 with open(‘file.txt’, ‘r’) as f: lines = f.readlines() 遍历列表中的每一行内容,使用正则表达式匹配需要修改的行。 import re for i in range(len(lines)…

    python 2023年6月3日
    00
  • python3 正则表达式基础廖雪峰

    Python3正则表达式基础 正则表达式是一种用于描述字符串模式的语言,可以用于配、查找、替换和分割。在Python中,可以使用re模块来使用正则表达式。本文将详细介绍Python中正则表达式的语法、字符集、转义字符以及常用函数,并提供两个示例说明。 基本语法 正则表达式由普通字符和元成,普字符表示本身,而元字符则有特殊的含义。下面是一些常用元字符: .:匹…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部