龙卷风中的异步操作

时间:2015-11-20 14:32:01

标签: asynchronous tornado coroutine

我试图了解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基准测试工具测试我的Tornado,其中包含100个请求和50个并发请求。

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

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

我不明白我在哪里做错了。

提前谢谢

1 个答案:

答案 0 :(得分:1)

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