无法理解tornado的异步
看了一些tornado异步的实现,我发现,人们在使用异步非阻塞特性的时候都是使用的线程的能提供异步的package,比如tornado.httpclient.HTTPClient(),但是我要怎样才能将自己的一个耗时函数(比如下面的sleep)变成异步非阻塞呢,代码如下
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
tornado.ioloop.IOLoop.instance().add_callback(self.sleep)
self.finish('OK')
def sleep(self):
for i in range(100000000):
if i % 100000 == 0:
print(i)
print('ooo')
当用该handler处理请求时,能立即返回'OK'表示异步能实现,但是在处理sleep的时候却不能处理其他的请求,其他请求会被阻塞知道之前这个请求处理完毕。请问各位大牛有什么方法将自己写的耗时函数变成异步非阻塞呢(不使用线程池,既然异步是tornado的特性,应该是有方法的撒)?
这和tornado的单线程循环有关吗?
理解错了异步、阻塞和并发,tornado确实能做到异步和非阻塞,但是单线程怎样做到并发呢,当第一个请求过来tornado返回过后,后台还在处理耗时任务,此时如果有其他请求过来,其他请求会处于一直等待的状态,这不是表明无法并行吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
http://www.tornadoweb.org/en/stable/gen....
自己的耗时操作可以用tornado.gen.Task来实现异步,你的函数会收到一个callback参数,当任务完成时,调用callback。
tornado的异步是以协程实现的,注意方法上的coroutine装饰器,代码执行到yield或者await(py3.5后)会将控制权交还给ioloop去处理其他待处理的协程,而之前的被协程装饰器包裹的方法就在运行啊,所以实现了异步,请参考tornado源码gen.py部分以及ioloop.py源码
才发现是个坟贴…………忽略我…………
异步就是在做某事之前做另外一件事。