[英]Explaining python tornado async
因此,我一直在研究如何编写异步代码,并且提出了以下代码:
我有以下两个问题:
from tornado import gen
import tornado.web
import tornado.ioloop
import motor
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@gen.coroutine
def get(self):
post = yield db.user.find_one()
print post
self.write(post['name'])
handlers=[(
(r'/', MainHandler)
)]
db = motor.MotorClient().example
if __name__ == '__main__':
application = tornado.web.Application(handlers,debug=True)
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
异步性是接口的属性; 使用@gen.coroutine
足以使此处理程序异步,因为它会更改接口(以返回Future
。 @asynchronous
,您无需在此处使用@asynchronous
装饰器;由于Tornado 3.1以来,仅@coroutine
装饰器就可以了。足够)。 此外,由于Motor返回了要产生的Futures
,因此我们知道它也是异步的。
阻塞是执行的财产; 您真正要问的是我们如何知道此处理程序是否是非阻塞的。 不幸的是,这是一个棘手的问题。 从Motor的文档中我们知道它的设计和意图是无阻塞的,但是没有简单的方法来验证它实际上是完全无阻塞的。 在http://www.tornadoweb.org/en/stable/guide/async.html上有更多关于异步和非阻塞意味着什么的讨论。
Tornado使用一个主线程是因为单线程非阻塞系统比线程系统可以获得更高的性能(尤其是在考虑python GIL施加的限制时),并且使所有内容异步的复杂性被以下事实抵消了:通常不需要担心线程安全性问题。
编写异步代码的最佳方法是编写类/函数。 然后调用类/函数。 此方法允许事件循环处理回调。 看下面的代码示例,创建了一个函数,然后将该函数用作回调。 这(允许)使事件循环以异步方式执行回调。
from tornado.httpclient import AsyncHTTPClient
def asynchronous_fetch(url, callback):
http_client = AsyncHTTPClient()
def handle_response(response):
callback(response.body)
http_client.fetch(url, callback=handle_response)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.