Tornado 中的异步操作

Asynchronous operation in Tornado

我正在尝试了解 Tornado 如何在异步和非阻塞模式下工作。

我只希望我的 RequestHandler 将 sum(range(10000000)) 的结果写回客户端。

我在 RequestHandler 中尝试过这种方式:

@tornado.gen.coroutine
def post(self, *args, **kwargs):
    res = yield tornado.gen.Task(self._sum, 10000000)

    self.write("Result: %d" % res)
    self.finish()

def _sum(self, size, callback):
    callback(sum(range(size)))

我正在使用 apache2 基准测试工具通过一组 100 个请求和其中的 50 个同时测试我的 Tornado。

问题是我得到以下代码的相同时间(整个测试约 15 秒):

def post(self, *args, **kwargs):
    res = sum(range(10000000))
    self.write("Result: %d" % res)

我不明白我哪里做错了。

提前致谢

Tornado 未针对并发计算进行优化 - 事实上,标准 Python 解释器本身无法在单个进程中进行并发计算。 Tornado 经过优化可以同时执行异步 网络操作 。您的测试是计算密集型的,因此您正确地发现围绕计算执行 "yield" 没有任何好处。