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" 没有任何好处。
我正在尝试了解 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" 没有任何好处。