【问题标题】:Explaining python tornado async解释 python 龙卷风异步
【发布时间】:2015-01-18 17:20:32
【问题描述】:

所以我一直在研究如何编写异步代码,我想出了下面的代码:

我有以下两个问题:

  1. 我们如何假设这段代码是异步的?我们只是依赖于使用 gen 模块使其异步的事实(当然我们需要为 gen 协程编写异步模块)
  2. 为什么tornado 包含一个主线程?我们可以有一个主线程链接到一个线程池,该线程池链接到另一个线程池吗?这个问题更倾向于我们用一个主线程实现什么?
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()

【问题讨论】:

    标签: python multithreading asynchronous tornado tornado-motor


    【解决方案1】:

    异步接口的一个属性;使用@gen.coroutine 足以使这个处理程序异步,因为它改变了接口(返回一个Future。顺便说一句,你不需要在这里使用@asynchronous 装饰器;因为Tornado 3.1 @coroutine 装饰器一个人就够了)。此外,由于 Motor 返回 Futures 以被屈服,我们知道它也是异步的。

    阻塞实现的一个属性;你真正要问的是我们如何知道这个处理程序是否是非阻塞的。不幸的是,这是一个更棘手的问题。我们从 Motor 的文档中知道它的设计和意图是非阻塞的,但是没有简单的方法来验证它实际上是完全非阻塞的。在http://www.tornadoweb.org/en/stable/guide/async.html 有更多关于异步和非阻塞意味着什么的讨论。

    Tornado 使用单个主线程,因为单线程非阻塞系统可以实现比线程系统更高的性能(特别是考虑到 python GIL 施加的限制时),并且使一切异步的复杂性被事实上,您通常不需要担心线程安全问题。

    【讨论】:

      【解决方案2】:

      编写异步代码的最佳方式是编写类/函数。 然后调用类/函数。此方法允许事件循环 处理回调。看下面的代码示例,有功能 创建,然后该函数用作回调。这(agian)是 允许事件循环以异步方式进行回调。

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多