与协程相比,龙卷风表现更差?

时间:2016-11-14 22:57:03

标签: python api tornado coroutine

我对coroutines in Tornado的基本理解是,它们应该有助于扩展API服务器,特别是在处理并发请求时,每个请求都需要花费相当多的时间才能完成。但是,在一个简单的负载测试中,我设置似乎使用协同程序实际上比使用简单的阻塞函数调用更糟糕...

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

GET /v1/info with 4 locusts

GET /v2/info with 4 locusts

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

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

1 个答案:

答案 0 :(得分:1)

你的协程在这里没有做任何异步,所以协程装饰器是严格的开销。只有当您使用@coroutine等待其他协同程序或其他异步操作时,yield装饰器才有用。在这种情况下,你正在进行的缓慢的事情是cpu绑定的,所以你可以做的唯一一件事就是使协同程序更好地运行它是在yield thread_pool_exector.submit(task)的线程上运行它(尽管它不会帮助你在这种情况下表现很好,多亏了python GIL)。当您的程序受IO限制时,或当您为外部事件(“实时”Web应用程序)保持连接打开时,协同程序会提供帮助。