繁体   English   中英

解释python龙卷风异步

[英]Explaining python tornado async

因此,我一直在研究如何编写异步代码,并且提出了以下代码:

我有以下两个问题:

  1. 我们如何才能假定此代码是异步的? 我们只是要依靠使用gen模块使其异步的事实(当然,我们需要为gen coroutine编写异步模块)
  2. 龙卷风为什么要合并一个主线程? 我们可以有一个主线程链接到一个线程池,而该线程池又链接到另一个线程池吗? 这个问题更多的是关于我们通过一个主线程可以实现什么?
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM