gpt4 book ai didi

python - 解释 python Tornado 异步

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:57 24 4
gpt4 key购买 nike

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

我有以下两个问题:

  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()

最佳答案

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

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

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

关于python - 解释 python Tornado 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28012565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com