09 | Tornado源码分析:Future 对象
时间:2022-07-22
本文章向大家介绍09 | Tornado源码分析:Future 对象,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天我们来看一下 Future 这个对象。从字面意思来看有“未来,将来......”之意义。那它在Tornado 构建的体系中扮演者什么样的角色呢?我们先看一下它的源码:
以上是 Future 中比较核心的方法,为了我们能整体的把握这个类的内容明白其运行原理,我对这个类进行了整理,可以看一下我整理后对这个类中的核心代码的解释:
# -*- encoding: utf-8 -*-
# !/usr/bin/python
"""
@File : future_learn.py
@Time : 2020/07/25 15:40
@Author : haishiniu
@Software: PyCharm
"""
class Future(object):
def __init__(self):
self._done = False # 异步操作是否执行完成
self._result = None # 如果异步操作成功执行完成,则将结果保存到 self._result
self._exc_info = None # 如果异步操作执行过程中出现异常,则将异常信息保存到self._exc_info
self._callbacks = [] # 回调函数列表。在异步操作执行完成之后,会挨个调用这些回调函数
def running(self):
return not self._done
def done(self):
return self._done
def result(self, timeout=None):
# 如果异步操作成功执行,则返回它的结果
if self._result is not None:
return self._result
# 如果异步操作执行失败,则重新抛出异常信息
if self._exc_info is not None:
try:
raise_exc_info(self._exc_info)
except Exception as ex :
print(ex)
finally:
self = None
# 如果异步操作尚未完成,则等待它执行结束,然后返回它的结果
# 但是在 tornado 中没有实现阻塞的等待结果,
# 如果异步操作没有完成,调用该方法会引发异常
# 所以,最好是:
# if future.done():
# result = future.result()
# ...
self._check_done()
return self._result
def exception(self, timeout=None):
# 如果异步操作抛出了异常,那么就返回异常对象
if self._exc_info is not None:
return self._exc_info[1]
else:
# 如果异步操作尚未完成,则抛出异常。
# 如果异步操作成功执行,则返回None。
self._check_done()
return None
def add_done_callback(self, fn):
# 当异步操作已经执行完成时,立即调用回调函数
if self._done:
fn(self)
# 否则,添加到回调函数列表。当异步操作执行完成时,会挨个调用这些回调函数
else:
self._callbacks.append(fn)
def set_result(self, result):
# 如果该 Future 对象所绑定的异步操作,成功执行了,在异步操作中
# 应该调用 Future 对象的 set_result() 方法设置执行结果。
# 该方法会将结果保存起来,并且将 Future 对象设置为完成,最后还会挨个调用回调函数
self._result = result
self._set_done()
def set_exc_info(self, exc_info):
# 将异常信息保存到 self._exc_info 属性
self._exc_info = exc_info
try:
# 调用 _set_done() 将该Future对象标记位完成;并调用所有的回调函数
self._set_done()
except Exception as ex:
print(ex)
self._exc_info = exc_info
def _check_done(self):
# 因为在 tornado 的这个实现中,不支持阻塞等待异步操作的结果。
# + 所以,当异步操作尚未完成时,会直接抛出异常。
if not self._done:
raise Exception("DummyFuture does not support blocking for results")
def _set_done(self):
self._done = True
for cb in self._callbacks:
try:
# 执行回调
cb(self)
except Exception as ex:
print(ex)
# 回调完成后 回调队列设置为 None
self._callbacks = None
在代码中我已经做了比较详尽的批注,大家可以结合代码和批注来理解这个类中的内容。 总结: 1. Future 对象是用来存储异步操作的结果的。 2. 在tornado中,Future 通常和 IOLoop.add_future()一起使用,或者由gen.coroutine 修饰的生成器函数yield它们。 3.本质上,Future就是一个"占位符"。 需要注意的是:Future是非线程安全的。
好的,本期我们就先分享到这里,若还有疑问可以给我留言进行进一步的交流,谢谢。
- 我的第三个网页制作:b、i、s、u、sub、sup标签的使用
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战04】Agent类和SARSA算法实现
- 我的第二个网页制作:p,hn,br标签的使用
- 超级账本项目:架构设计
- 我的第四个网页制作:列表标签
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp
- 虎嗅主站盲打成功(已进后台)
- 我的第五个网页制作:pre、html转义、abbr标签的使用
- UVALive 3882 - And Then There Was One【约瑟夫问题】
- 超级账本项目:链码示例
- 我的第六个网页制作:table标签
- POJ 1163 The Triangle【dp+杨辉三角加强版(递归)】
- UVA 11039-Building designing【贪心+绝对值排序】 UVA11039-Building designing
- UVA 11636-Hello World!(水题,猜结论) UVA11636-Hello World!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
- .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载
- 蓝牙芯片----BK3431开发笔记------RW stack中添加自定义服务教程(4)
- 图像简单处理
- 蓝牙---BLE GATT介绍
- Access数据库密码破解 C#
- 没啥用,更换注册表信息使webbrower选择适合的版本
- linux下分割和合并压缩包
- 编译.net .net Core程序 代码,仅做备份
- js删除数组对象中符合条件的数据
- .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
- 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
- 一网打尽枚举操作 .net core
- Jenkins 发布.net core 程序,服务端无法下载nuget包的解决方法 error NU1102: 找不到版本为 (>= 3.1.6) 的包
- NET Core Kestrel部署HTTPS 一个服务器绑一个证书 一个服务器绑多个证书