在 Tornado 的线程中运行长阻塞函数时出现问题

2023-12-27

我对龙卷风很陌生。只是看看如何处理龙卷风中阻塞的请求。我在单独的线程中运行阻塞代码。然而,主线程仍然阻塞,直到线程函数完成。我在这里没有使用 gen.coroutine,但已经尝试过,结果是相同的

counter = 0

def run_async(func):
    @wraps(func)
    def function_in_a_thread(*args, **kwargs):
        func_t = Thread(target=func, args=args, kwargs=kwargs)
        func_t.start()
    return function_in_a_thread

def long_blocking_function(index, sleep_time, callback):
    print "Entering run counter:%s" % (index,)
    time.sleep(sleep_time)
    print "Exiting run counter:%s" % (index,)

    callback('keyy' + index)


class FooHandler(tornado.web.RequestHandler):

    @web.asynchronous
    def get(self):

        global counter
        counter += 1
        current_counter = str(counter)

        print "ABOUT to spawn thread for counter:%s" % (current_counter,)
        long_blocking_function(
            index=current_counter,
            sleep_time=5, callback=self.done_waiting)


        print "DONE with the long function"

    def done_waiting(self, response):
        self.write("Whatever %s " % (response,))
        self.finish()


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/foo", FooHandler),
                    ]

        settings = dict(
            debug=True,
        )

        tornado.web.Application.__init__(self, handlers, **settings)


def main():
    application = Application()
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

当我连续发出请求时,FooHandler 会阻塞并且在 long_blocking_function 完成之前不会收到任何请求。所以我最终看到了类似的东西

ABOUT to spawn thread for counter:1
Entering run counter:1
Exiting run counter:1
DONE with the long function
ABOUT to spawn thread for counter:2
Entering run counter:2
Exiting run counter:2
DONE with the long function
ABOUT to spawn thread for counter:3
Entering run counter:3
Exiting run counter:3
DONE with the long function

我期待着这些方面的事情(因为我在第一次调用 long_blocking_function 完成之前发出多个请求),但我只看到类似于上面的跟踪

ABOUT to spawn thread for counter:1
DONE with the long function
ABOUT to spawn thread for counter:2
DONE with the long function
ABOUT to spawn thread for counter:3
DONE with the long function
ABOUT to spawn thread for counter:4
DONE with the long function

我看过Tornado 阻塞异步请求 https://stackoverflow.com/questions/13051591/tornado-blocking-asynchronous-requests并尝试了两种解决方案。但是当我向同一个处理程序发出连续请求来运行它们时,它们都会阻塞。有人能弄清楚我做错了什么吗?我知道龙卷风在多线程方面表现不佳,但我应该能够以非阻塞方式从中运行一个新线程。


龙卷风与并发期货 http://docs.python.org/dev/library/concurrent.futures.html图书馆(有一个Python 2.x 向后移植 https://pypi.python.org/pypi/futures可用),因此您可以使用线程池执行器 http://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor.

这种技术效果很好——我们用它来处理长时间运行的数据库操作。当然,在现实世界中,您还希望以稳健且优雅的方式处理超时和其他异常,但我希望这个示例足以说明这个想法。

def long_blocking_function(index, sleep_time, callback):
    print ("Entering run counter:%s" % (index,))
    time.sleep(sleep_time)
    print ("Exiting run counter:%s" % (index,))
    return "Result from %d" % index


class FooHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        global counter
        counter += 1
        current_counter = str(counter)

        print ("ABOUT to spawn thread for counter:%s" % (current_counter,))
        result = yield self.executor.submit(long_blocking_function,
                                            index=current_counter,
                                            sleep_time=5)
        self.write(result)
        print ("DONE with the long function")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Tornado 的线程中运行长阻塞函数时出现问题 的相关文章

  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我

随机推荐

  • QQuickFramebufferObject:自定义FBO在哪里使用?这怎么会导致闪烁呢?

    我目前正在 QML 中集成自定义 OpenGL 视口QQuickFramebuffer对象 我观察到整个应用程序窗口 不仅是QQuickFramebuffer对象窗口 我想知道为什么 我的定制QQuickFramebufferObject
  • 使用 AppDelegate 进行数据操作和处理是一个好习惯吗?

    我正在制作一个对象AppDelegate并在我的程序中使用它 我已经声明了所有的setter和getter 并且还在其中插入 选择 删除 更新数据库的查询 我想问这样做是一个好的做法吗 如果是 那么如何 如果不是 那么为什么这不是一个好的做
  • 全球化如何设定?

    我陷入了 ASP NET Web API 全球化问题 当我调用 Web API 时 我想获取特定于文化的格式的日期时间 请提供一些见解 在我的解决方案中 首先有一个委托处理程序 其工作是设置文化 它的定义如下 using System us
  • -[UIImage length]:无法识别的选择器发送到带有图像的 NSMutableArray 实例错误

    我有一个故事板应用程序 其中有一个UIViewController and a UICollectionViewController 在视图控制器中 用户从iPhone的照片库中选择多张照片 由于iOS中没有用于多选的API 所以我使用EL
  • PHP system() 和 exec() 函数不适用于临时文件

    我正在使用system PHP 中的函数来调用我需要使用的 CLI 程序 该程序当前在 PHP 中不可用 代码如下 我使用 xml2brl liblouisxml CLI 生成包含盲文 ASCII 文本的输出文件 使用下面的代码 成功创建了
  • sbt使用项目中的类自定义任务

    如何将自定义任务添加到使用 使用类 运行方法等 项目源的 sbt 构建定义 看起来它甚至在编译之前就试图找到它们 我需要知道你为什么要调用这些方法 因为这会改变答案 如果你想做某事 构建相关 想要使用类 方法来执行一些与构建相关的操作 缩小
  • 将 Youtube 播放列表解析为 Listview

    我试图获取 YouTube 播放列表并在列表视图中显示它 我在用着本教程 http blog blundell apps com show youtube user videos in a listview 它对我来说可以很好地获取视频来自
  • 如何确定我的 Java 应用程序正在哪个监视器中运行?

    我想开发一个 Java 应用程序来获取正在运行该应用程序的监视器的屏幕截图 因此 30 分钟前我问了一个有关如何捕获该应用程序正在运行的每个监视器的屏幕截图的问题 但似乎问题已在这里提出并回答 java打印屏幕两个显示器 https sta
  • 将 JavaScript 数组作为参数传递给 WebAssembly 函数

    我想测试 WebAssembly 进行一些复杂的数组计算 所以我写了一个简单的 C 函数添加两个int每个包含 3 个元素的数组 hello cpp extern C void array add int summed int a int
  • Gradle 找不到 android 插件的类路径

    我收到此错误 说它找不到与 android 插件相关的类路径 使用 gradle 1 2 这是错误 Could not find method classpath for arguments org gradle api plugins g
  • 尝试使用 S/4HANA Cloud SDK 使用来自 S/4HANA Cloud 的数据源创建自定义 OData v2 服务

    我正在尝试使用 S 4HANA Cloud SDK 使用 S 4HANA Cloud 数据源在 java 中创建自定义 OData v2 服务 我尝试遵循 SAP Press 书籍 Extending SAP S HANA Side by
  • 如何在notepad++中将一行中的第一个字母设置为大写

    我想在记事本 中将每行的第一个字母设置为大写 我该怎么做 您可以选择仅包含第一列的块 按住Alt当用鼠标选择时 然后按Ctrl Shift U将选定的字母转换为大写 这种选择称为矩形选择在 Notepad 帮助中 您还可以通过按键盘来定义选
  • 如何通过注释在 spring mvc 3 中设置标头无缓存

    如何通过注释在 spring mvc 3 中设置标头无缓存 不是 response setHeader Pragma No cache response setHeader Cache Control no cache response s
  • 扩展 2 个 PHP 类

    我有 3 个课程 3 个文件 a class php b class php c class php 我想在类c 文件3 中扩展类a和b 我怎么能这么做呢 我想在我的新类 C 中使用 a b 的两个类函数 你正在要求多重继承 http en
  • argocd部署后如何运行应用程序E2E测试?

    我想知道在使用 ArgoCD 成功部署任何微服务后 如何运行应用程序 E2E UI 或 API 测试 当前设置 我使用 github actions 设置了 CI 管道 完成任何微服务的 CI 构建后 它会更新位于 github 存储库之一
  • 在移动应用程序中安全地硬编码密码

    我有一个网络服务器 它创建一个二维码 该二维码是 用户名 用户名 密码 的md5哈希值 其中 用户名 是当时登录的用户 其中 password 是我设置的系统密码 对于网络服务器和应用程序来说是通用的 我的 Android iPhone B
  • Android - 用于调试和发布模式的应用程序图标

    如果我们在清单中设置 android debuggable true 并且像在 iOS 中那样设置 android debuggable false 是否可以为应用程序设置单独的图标 我参加聚会有点晚了 但无论如何 目前我在 16 年发布此
  • 如何将十六进制转换为字节数组?

    我从 sql server 中复制并粘贴了这个二进制数据 但目前无法查询 0xBAC893CAB8B7FE03C927417A2A3F6A60BD30FF35E250011CB25507EBFCD5223B 在 C 中如何将其转换回字节数组
  • Firefox 3.6 中的本机拖放文件上传

    最近 一位同事告诉我 Firefox 3 6 支持本机拖放文件上传 从操作系统调整图像大小 无需任何扩展或插件 任何人都可以发布代码片段或提供演示此新功能的链接 因为我在 Google 搜索中找不到太多内容 它相当重要 对于 HTML 因此
  • 在 Tornado 的线程中运行长阻塞函数时出现问题

    我对龙卷风很陌生 只是看看如何处理龙卷风中阻塞的请求 我在单独的线程中运行阻塞代码 然而 主线程仍然阻塞 直到线程函数完成 我在这里没有使用 gen coroutine 但已经尝试过 结果是相同的 counter 0 def run asy