缓存和重用函数会导致 Tornado

2024-01-19

我有一个昂贵的功能要包含在我的 Tornado 应用程序中。功能 返回多个输出,但由于遗留原因,这些输出被访问 分别通过不同的处理程序。

有没有办法只执行一次函数,然后将结果重复使用 不同的处理程序并保留 Tornado 的异步行为?

from tornado.web import RequestHandler
from tonado.ioloop import IOLoop

# the expensive function
def add(x, y):
    z = x + y
    return x, y, z

# the handlers that reuse the function
class Get_X(RequestHandler):
    def get(self, x, y):
        x, y, z = add(x, y) 
        return x

class Get_Y(RequestHandler):
    def get(self, x, y):
        x, y, z = add(x, y) 
        return y

class Get_Z(RequestHandler):
    def get(self, x, y):
        x, y, z = add(x, y) 
        return z

# the web service
application = tornado.web.Application([
    (r'/Get_X', Get_X),
    (r'/Get_Y', Get_Y),
    (r'/Get_Z', Get_Z),
])

application.listen(8888)
IOLoop.current().start()

我考虑过将函数的结果缓存在字典中,但我不确定如何让其他两个处理程序等待,而第一个处理程序创建一个字典条目。


Tornado Futures是可重复使用的,所以你可以简单地保存Future在屈服之前。许多现成的缓存装饰器(例如 python 3.2 的functools.lru_cache如果你把它们放在前面就会起作用@gen.coroutine:

import functools
from tornado import gen
from tornado.ioloop import IOLoop

@functools.lru_cache(maxsize=100)
@gen.coroutine
def expensive_function():
    print('starting expensive_function')
    yield gen.sleep(5)
    return 1, 2, 3

@gen.coroutine
def get_x():
    print('starting get_x')
    x, y, z = yield expensive_function()
    return x

@gen.coroutine
def get_y():
    print('starting get_y')
    x, y, z = yield expensive_function()
    return y

@gen.coroutine
def get_z():
    print('starting get_z')
    x, y, z = yield expensive_function()
    return z

@gen.coroutine
def main():
    x, y, z = yield [get_x(), get_y(), get_z()]
    print(x, y, z)

if __name__ == '__main__':
    IOLoop.current().run_sync(main)

Prints:

starting get_x
starting expensive_function
starting get_y
starting get_z
finished expensive_function
1 2 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓存和重用函数会导致 Tornado 的相关文章

随机推荐

  • 如何将命令嵌入到 bash 中作为内置命令? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 C 编程语言创建了一个命令行实用程序 现在我想将该命令嵌入到 bash 中 它应该充当 bash 内置命令 cd 我怎样才能做
  • 如何在 bash 下获得两个日期之间的差异[重复]

    这个问题在这里已经有答案了 正如问题听起来一样 我想从 20120203 中减去 20120115 并得到 19 作为答案 在 shell 脚本中实现此功能的最佳方法是什么 let DIFF date s d 20120203 date s
  • Python:将列表分解为所有可能的子列表

    假设我有一个整数列表 mylist 101 102 103 104 105 106 现在我需要创建每个可能的子列表划分 保留顺序 sublists 101 102 103 104 105 106 101 102 103 104 105 10
  • Java 默认方法比抽象类中的相同代码慢

    我有一个界面PackedObject public interface PackedObject int get int sum void setIndex int index default int defaultSum return g
  • 尝试进行深度附加时帧缓冲区状态错误(返回 36054)

    下面是为阴影映射设置帧缓冲区的代码 但在检查帧缓冲区状态时返回 36054 有任何想法吗 bind framebuffer for shadow mapping gl glGenFramebuffers 1 framebuff gl glB
  • 如何声明在 kotlin 伴随对象中声明的本机 cpp 方法?

    我有一个 Kotlin 类 它只声明一些用于 Kotlin 和 C C 交互的方法 class JNILib companion object external fun getAppId String init System loadLib
  • 是否可以隐藏 asp:repeater 中的列?

    我需要隐藏一列asp repeater 最好将它们隐藏在服务器端 而不仅仅是通过 CSS 在 HTML 中 中继器有一个ID 但我很难在调试器中找到它拥有的表 考虑到中继器的工作原理 我不确定它是否可能 我给了 HTMLtable an I
  • Java 中的流如何影响内存消耗?

    我已经多次使用流 但我从来没有读过太多关于它们实际工作原理的内容 除了流只是一个隐喻之外 我对它们也了解不多 流仅表示字节序列 我不太了解它们的实际工作原理 我猜想在 Java 中打开文件流与具有向流提供 指针 功能的操作系统进行交互 基本
  • 最小起订量静态类中的静态方法

    public Product GetbyID int id try mycode Product p catch DataAccessException ex throw new BusinessException ex ErrorCode
  • 为什么 Composer 无法正确安装 Laravel 5.6? [复制]

    这个问题在这里已经有答案了 我无法在我的电脑上安装 Laravel 5 6wamp服务器 我有以下设置 PHP 版本 7 1 3 作曲家版本1 6 3 2018 01 31 当我尝试通过 Composer 安装 Laravel 应用程序时
  • iPhone 单元测试

    我在大学的 iPhone 开发人员上完成了我的项目 没有做 有用的 单元测试 做了一些简单的测试只是为了放在我的报告上 我正在研究苹果的单元测试套件 逻辑和应用程序测试 但最终使用了 google toolbox for mac 中的 iP
  • 从 localStorage 保存和加载图像

    所以基本上 我试图将图像保存到localStorage 然后在下一页上加载相同的图像 我遇到了这个很好的例子 http jsfiddle net 8V9w6 http jsfiddle net 8V9w6 不过 我完全不知道这是如何工作的
  • 如何在没有表单标签的情况下更改 Mobile Safari 键盘中的返回键文本?

    我想更改 返回 按钮上的文本移动Safari当我的输入元素聚焦时的键盘 我知道你可以这样做
  • 如何继续处理 pandas fillna 中的“None”值

    我有以下字典 fillna value first name Andrii last name Furmanets created at None 当我把那本字典传给fillna I see raise ValueError 必须指定填充方
  • 如何写出 HTML 实体名称( 、<、> 等)

    我如何在 HTML 中编写实体名称而不让它执行其功能 示例 我正在做一个教程 想告诉某人如何在代码中使用不间断空格 nbsp 那么 如何实际写出 n b s p 但它是否流畅且没有空格 您可以使用 amp 代替 So nbsp 将 amp
  • 检查 ArrayList 是否包含给定对象

    假设我有这样的课程 class A int elementA int elementB 我也有一个ArrayList像这样 ArrayList a listObj 如何检查该列表是否包含仅使用某些属性的对象A 例如 仅考虑elementA用
  • 如何使 TFS 2015 中的 PowerShell 任务构建失败

    我试图使 PowerShell 脚本中的某个结果在构建过程中失败 但它对我不起作用 我正在使用 TFS 2015 中的新构建操作并尝试了以下选项 记录命令 https github com Microsoft vso agent tasks
  • nginx 静态索引重定向

    这看起来很荒谬 但我在一个多小时的搜索中没有找到有效的答案 我有一个运行 nginx 的静态网站 恰好位于 Varnish 后面 索引文件称为index html 我想重定向实际访问该 URL 的任何人mydomain com index
  • 计算图像特征配准中的仿射变换矩阵

    我有两张图像 一张是对另一张应用仿射变换的结果 我可以通过使用 OpenCV 中的 ORB create 函数提取点来使用单应性注册它们 但是 我想计算此变换所需的仿射矩阵 有什么方法可以简单地通过两张图像来做到这一点吗 检测旋转的矩形并使
  • 缓存和重用函数会导致 Tornado

    我有一个昂贵的功能要包含在我的 Tornado 应用程序中 功能 返回多个输出 但由于遗留原因 这些输出被访问 分别通过不同的处理程序 有没有办法只执行一次函数 然后将结果重复使用 不同的处理程序并保留 Tornado 的异步行为 from