当前位置: 首页 > 知识库问答 >
问题:

如何使用具有长时间运行函数的python tornado@gen.coroutine

谢海阳
2023-03-14

我有一个web应用程序,也在做真正密集的数据处理。有些函数非常慢(想想几分钟)。

# code that is using to much memory because of the new threads being spawned 
def handler():
   thread = Thread(target = really_slow_function)
   thread.start()
   thread.join()
   return "done"

def really_slow_function():
   # this is an example of an intensive function
   # which should be treated as a blackbox
   sleep(100)
   return "done"
#code that doesn't scale because all the requests are block on that one slow request.
@gen.coroutine
def handler():
   yield really_slow_function()
   raise gen.Return("done")

def really_slow_function():
   # this is an example of an intensive function
   # which should be treated as a blackbox
   sleep(100)
   return "done"

这个重构的问题是tornado服务器阻塞了really_slow_function,同时无法为其他请求提供服务。

所以问题是:有没有一种方法可以重构处理程序,而不触及really_slow_function,也不创建新的线程/进程?

共有1个答案

夹谷和韵
2023-03-14

使用ThreadPoolExecutor(来自Concurrent.Futures包)在单独的线程中运行长时间运行的函数,而无需每次启动新线程。

async def handler():
    await IOLoop.current().run_in_executor(None, really_slow_function)
    return "done"

如果您想准确控制有多少线程有资格运行此函数,您可以创建自己的执行器并传递它,而不是none

 类似资料:
  • 我正在尝试将一个向服务器发送消息的异步任务迁移到RxJava。该任务大致执行以下操作: 1) 创建将要发送的消息(保存到数据库) 2)向用户显示消息(状态为“发送”) 3)将消息发送到服务器(下面的代码段) 4)将消息标记为已发送或失败(保存到数据库) 5)更新UI 我创建了所需的Rx链,部分如下所示: 当我订阅上述内容时,我会得到一个一次性的。通常,我会将其添加到CompositeDisposa

  • 每个人在最新的更新之后,Studio在运行应用程序之前已经运行了很长时间(3-40分钟)“运行Gradle Build”。如何治疗?当前Studio版本:1.3。2.

  • 问题内容: 我有一个简单地发出一些ajax请求的jQuery代码。 大多数情况下,获得响应所需的时间不到一秒钟,因此我可以将结果显示给用户。 但是有时候(大约需要5%的重载)需要几秒钟的时间(我可以接受,服务器有点忙)。 我想在超过2秒的时间内显示“请稍候”文本。但是不到2秒就不会出现(因此用户不会因快速显示/隐藏消息而感到困惑)。 如何以最有效,最简单的方式制作它? 当前的jQuery代码: 问

  • 问题内容: 是否可以获取旧的运行过程的开始时间?如果今天不是开始日期,似乎会报告日期(而不是时间),如果今年不是开始日期,则只会报告日期。旧工艺会永远失去精度吗? 问题答案: 您可以指定格式器并使用,例如以下命令: 上面的命令将输出所有进程,并带有格式化程序以获取PID,命令运行以及启动日期和时间。 示例(从Debian / Jessie命令行) 您可以阅读的联机帮助页或查看Opengroup的其

  • 我通常使用以下语法按天分组: 现在,我的日期值位于名为的JSONB列中。 这会产生以下错误: 错误:函数日期(未知,文本)不存在第1行:选择日期('day',“extras”- 有没有办法让这一切顺利进行?

  • 我正在使用rxjava将一些任务上载到服务器,每当任务启动的片段或活动被销毁时,我都会处理订阅以避免内存泄漏,但我想要的是,即使在片段/活动被销毁后,我也需要继续在后台运行任务,有什么方法可以实现这一点吗? 实例 是否必须始终释放订阅?如果不是,何时使用dispose?