【问题标题】:Tornado performing worse with coroutines vs. without?Tornado 与协程相比表现更差?
【发布时间】:2017-03-28 17:04:14
【问题描述】:

我对@9​​87654321@ 的基本理解是,它们应该有助于扩展 API 服务器,尤其是在处理并发请求方面,每个请求都需要相当长的时间才能完成。然而,在我设置的一个简单的负载测试中,使用协程似乎比使用简单的阻塞函数调用更糟糕......

下面是两个屏幕截图,显示了使用负载测试并发级别 4(即 4 个蝗虫或“用户”)时的 API 响应时间。 /v1 端点使用简单的阻塞函数调用,/v2 端点使用tornado.gen.coroutine。我预计 GET /v2/info 的平均响应时间会大大低于 GET /v1/info 的平均响应时间,但实际上平均响应时间实际上更高

我觉得我要么做错了什么,要么误解了一个基本概念。有人能告诉我为什么我的示例项目显示上面的数字吗?基于协程的 API 在并发负载下的性能比简单 API 差的地方在哪里?

示例tornado-loadtest 项目:https://github.com/martyychang/tornado-loadtest

【问题讨论】:

    标签: python api tornado coroutine


    【解决方案1】:

    你的协程在这里没有做任何异步的事情,所以协程装饰器是严格的开销。 @coroutine 装饰器仅在您使用 yield 等待其他协程或其他异步操作时才有用。在这种情况下,你正在做的缓慢的事情是 cpu-bound,所以你可以做的唯一的事情是让它更好地与协程一起工作,就是在一个带有 yield thread_pool_exector.submit(task) 的线程上运行它(尽管它不会对你的性能有太大帮助在这种情况下,感谢 python GIL)。当您的程序受 IO 限制时,或者当您为外部事件(“实时”网络应用程序)保持连接打开时,协程会提供帮助。

    【讨论】:

    • 感谢您的信息,本。所以,如果我正确理解你的答案:如果不是进行内存计算,而是从互联网下载一个大文件,那么协程可能会有用吗?
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多