Tornado个人学习记录,异步

学习自Tornado入门

导入Tornado

pip install Tornado

基础Tornado启动实例

在这里插入图片描述

打开浏览器可以看到localhost:8888可以看到hello,world

tornado主要构成

一个普通的tornado web通常有四部分:
1)ioloop实例,他是全局的Tornado事件循环,是服务器的引擎核心,示例中tornado.ioloop.IOLoop.current()就是默认的tornado ioloop实例。
2)app实例,他代表一个完成的后端app,他会挂接一个服务端端口对外提供服务,一个ioloop中可以有多个app,但一般不会用到多个,感觉类似Springboot中的启动类?
3)handler类,业务逻辑,类似service和serviceImpl,我们进行服务端开发就是写一些handler来实现请求。
4)路由表,他将指定url和handler挂接起来,形成一个表,根据请求的访问url来找到对应业务的handler。

这四个组件的关系是,一个ioloop包含多个app,一个app包含一个路由表,一个路由表有多个handler,ioloop是核心,是发动机,负责接收和相应客户端请求,负责驱动handler运行,负责服务器内部定时任务的执行。

Tornado流程

当一个请求到来时,ioloop读取这个请求解包为一个http请求对象,找到对应的app路由表,通过请求对象的url查询对应的handler,执行handler,一般handler都会返回一个对象,ioloop负责将对象包装成http响应对象序列化发给客户端。
同一个ioloop实例运行在一个单线程环境下。

提供一个阶乘服务

服务器会提供阶乘的缓存,已经计算过的就存起来,下次就不用重新计算了。使用Python的好处就是,我们不用当心阶乘的计算结果会溢出,Python的整数可以无限大。
在这里插入图片描述
在这里插入图片描述

打开浏览器,键入http://localhost:8888/fact?n=50,可以看到浏览器输出了

Tornado异步

主要学习自添加链接描述
tornado是单线程的,这就可以解释下面这个代码
在这里插入图片描述
在访问/blocking造成阻塞后,再次访问/index也会造成阻塞的问题。

tornado的异步主要有四种解决方法:
1)回调函数(基本不用)
2)tornado协程+生成器
3)tornado协程+Future
4)线程池进程池

tornado协程+生成器
在这里插入图片描述
带有yield修饰的函数,会生成一个生成器(generator),所有的生成器都是异步的,当调用函数时,会返回一个生成器,而不是执行完的结果,@gen.coroutine 装饰器通过 yield 表达式和生成器进行交流, 而且通过返回一个 Future 与协程的调用方进行交互. 协程一般不会抛出异常: 它们抛出的任何异常将被 Future 捕获 直到它被得到. 这意味着用正确的方式调用协程是重要的, 否则你可能有被 忽略的错误。@gen.coroutine 可以让你的函数以异步协程的形式运行,但是依赖第三方的异步库,要求你的函数本身不是blocking的。例如上面的os.sleep() 方法是blocking 的,没办法实现异步非阻塞。

tornado封装的协程+Future
这种是tornado推荐使用的,因为他有两个优点:
1.当处理异常时,可以简单的使用Futher.result函数抛出异常
2.对协程兼容性好,什么是协程
在这里插入图片描述
官方还介绍了在另一种写法, Python 3.5 引入了 async 和 await 关键字(使用这些关键字的 函数也被称为”原生协程”). 从Tornado 4.3, 你可以用它们代替 yield 为基础的协程. 只需要简单的使用 async def foo() 在函数定义的时候代替 @gen.coroutine 装饰器, 用 await 代替yield. 本文档的其他部分会继续使用 yield的风格来和旧版本的Python兼容, 但是如果 async 和 await 可用的话,它们运行起来会更快
在这里插入图片描述

并行执行:
在这里插入图片描述

如何调用一个函数时不等待其返回值,直接返回

刚开始考虑用threading新建一个子线程,子线程去执行函数,不知道是不是写的有问题,并不能达到要求。
于是在网上找了个方法可以实现。
在这里插入图片描述
还可以不写回调函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值