继续笔记下关于tornado async一些学习知识:
Tornado支持long-polling,在其提供的demo中推荐参考的例子就是那个chat demo,我这里参考chat demo,提供一个简单的long-polling测试应用“用于统计当前在线人数,并保持最新数据至各个客户端的同步更新”。
1. 通过URL加一个参数name来模拟在线用户。
2. Ajax long polling 不只是server端的轮询,client端也需要保持一种请求轮询状态,因为当前的大多数web server都不支持基于单向的HTTP链接的双向通信,我们可以通过websockets,但是这个将HTTP转换成其他形式的协议的操作,目前大多数的浏览器并没有广泛支持,我们可以联想到HTML5 Websockets。我们可以用一种long-lived 链接方式(tornado支持的),用于server和client端之间的数据传输, 类似push-pull的方式,我觉得。
3. 这次的测试,暂没有提供基于重写on_connection_close来处理offline的用户(直接关闭浏览器),所以用户统计的数量只会随着访问数量的增加而增加
Comet
我的测试代码,目前使用的是tornado 1.2.1
Server端:
import os
import string
import time
import logging
from datetime import datetime
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)
online = []
count = 0
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.user = self.get_argument("name", None)
self.render("templates/stack_p312a.html", title="Online number testing", c_time=datetime.now(), user=self.user)
class LongPollingHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
global online, count
self.user = self.get_argument("name", None)
if self.user not in online:
logging.info("user : " + self.user)
online.append(self.user)
http = tornado.httpclient.AsyncHTTPClient()
appURL = self.request.protocol + "://" + self.request.host
http.fetch(appURL + "/internal-polling", self._on_finish)
'''push to the client'''
def _on_finish(self, response):
if self.request.connection.stream.closed():
return
self.write("welcome %s, current online number(s) %s" % (self.user, response.body))
self.finish()
'''
def on_connection_close(self):
TODO, testing
'''
class InternalPollingHandler(tornado.web.RequestHandler):
'''
The internal polling for the new online member which will be counted into
the global online list, and then asynchronously push the latest data to the connected client,keep in a long-polling status.
'''
def get(self):
global online, count
logging.info("count : " + str(count))
logging.info("online : " + str(len(online)))
if count != len(online):
count += 1
self.get()
else:
self.write(str(count))
def main():
tornado.options.parse_command_line()
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
}
application = tornado.web.Application([
(r"/", MainHandler),
(r"/long-polling", LongPollingHandler),
(r"/internal-polling", InternalPollingHandler),
], **settings
)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
Client端(stack_p312a.html):
<html>
<head>
<title>{{ title }}</title>
<script type="text/javascript" language="JavaScript" src="{{ static_url("jquery-1.5.1.min.js")}}"></script>
<script type='text/javascript' language='JavaScript'>
function test(){
window.setTimeout(function(){
$.ajax({
url : '/long-polling?name={{ user }}',
success : function(data){
$("#num").text(data);
}
});
test();
}, 5000);
}
</script>
</head>
<body>
Current time is {{c_time}}
<br>
<input type="button" value="Test" onclick="test();"/>
<div id="num"></div>
</body>
</html>
简单说明:
1.
通过简单的提供
global online = []
global count = 0
用于用户在线用户的统计
2.
http://localhost:8888/?name=a
http://localhost:8888/?name=b
通过不同的name来模拟各个用户
-----------------------------------------------
对于on_connection_close,the select()-base implements of IOLoop (non-Linux systems) 相关的实现是在tornado 1.2下有修补一些问题,详细可以参考
changelist :
https://github.com/facebook/tornado/commit/1221865747ecfde69a0463b9a0d77b3c5b87f320
但是根据Ben Darnell的建议,并没有在windows下测试过,目前还在学习、讨论中。
-----------------------------------------------
在使用tornado async时一些体验:
1. self.render(), self.redirect()其中已经包含了self.finish()操作,我们在写相关的async callback时候,需要注意这个,不应重复使用self.finish()
2. RequestHandler.async_callback 这个方法从1.1版本开始已经废除,类似代码(下面)应该不再使用,可以通过AsyncHTTPClient来实现异步请求
@tornado.web.asynchronous
def get(self):
...
self.check_for_last_numbers(callback=self.async_callback(self.on_finish))
...
def check_for_last_numbers(self, callback):
...
3. self.finish(),self.flush() 可以“简单的理解”为一种server端的push操作,但是实际实现中,建议使用self.finish(),tornado可以基于之前的cursor、session(secure cookie)来重用之前的connection。
笔记先分享到这里,欢迎大家讨论,共同学习
分享到:
相关推荐
- ASGI(Asynchronous Server Gateway Interface)支持,为Python Web应用提供异步I/O。 - 新的优化编译模式,可以提升某些类型代码的运行速度。 - 以及对Type Annotations的增强,为静态类型检查提供更好的支持。 ...
在Java企业版(Java EE)6中,`@Asynchronous`注解是一个非常重要的特性,它使得开发者可以方便地在应用程序中实现异步处理。这个注解是Java EE并发编程的一部分,主要应用于EJB(Enterprise JavaBeans)环境,用于...
同时,学习如何使用Python的标准库和第三方库,如Numpy、Pandas、Matplotlib等,可以极大地提高开发效率。对于想要在PlatformIO IDE中开发的用户,熟悉相关硬件平台的驱动和通信协议,以及如何在Python中控制这些...
跨平台 Python 异步聊天机器人框架 - Asynchronous multi-platf-nonebot2
Starlette是Python中的一个轻量级的ASGI(Asynchronous Server Gateway Interface)框架,它允许开发者创建高性能的异步Web应用。ASGI是Python社区为处理现代Web应用的高并发需求而设计的标准接口。Starlette以其...
2. **异步编程(Asynchronous Programming)**:Python 3.7 对异步IO模型进行了优化,如 `asyncio` 模块,使得编写高性能的并发代码变得更加简洁。新增了 `async` 和 `await` 关键字,让协程(coroutines)的使用...
Python 3.7.3不仅为开发者提供了强大的功能,而且由于其易读性强和丰富的生态系统,使其成为学习编程的理想选择。在使用过程中,如果遇到官网下载速度慢的问题,可以从可靠的第三方源获取像"python-3.7.3-amd64.zip...
在本项目中,我们主要探讨如何使用Python 3.6版本和Tornado框架来构建一个简单的RESTful API,以便于部署和调用机器学习模型。RESTful API是一种遵循Representational State Transfer (REST)架构风格的Web服务设计...
3. **异步生成器(Asynchronous Generators)**:Python 3.7 引入了异步生成器,允许在 `asyncio` 库中使用 `yield from` 语法,这使得异步代码的编写更加灵活和高效。 4. **更安全的随机数生成**:`random` 模块在...
**Python库 | tencentcloud-sdk-python-taf-3.0.562.tar.gz** 本文将详细介绍关于`tencentcloud-sdk-python-taf-3.0.562`的使用和相关知识点,它是一个针对腾讯云服务的Python SDK,允许开发者在Python环境中便捷地...
这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...
10. **并发和异步(Concurrency and Asynchronous)**:Python的并发模型,如线程、进程和协程,是通过源码可以深入了解的复杂主题。特别是对于Python的全局解释器锁(GIL),理解其工作原理对于优化多线程程序有...
页面与后端Python代码的交互通常通过AJAX(Asynchronous JavaScript and XML)完成,这样可以在不刷新整个页面的情况下更新内容。 在服务器端,Python应用接收请求,解析请求中的主机名,然后调用ping函数。如果...
本应用笔记中描述的电路提供了一种“部分解决方案”,即虽然没有实际恢复出时钟,但可以完全提取到达的数据。图1展示了一个典型的使用场景。 #### 7系列FPGA中的LVDS 4倍异步过采样 在Xilinx 7系列FPGA中,...
通过学习以上知识点,并结合Python1903笔记06-web前端的压缩包内容,你可以建立起对Web前端开发的全面理解,为进一步深入Python Web开发打下坚实基础。记得实践是检验真理的唯一标准,理论学习的同时,动手编写代码...
《异步VLSI设计指南》是一本深入探讨复杂集成电路设计领域的专著,主要关注的是异步电路的设计方法。VLSI(Very Large Scale Integration)指的是超大规模集成电路,是现代电子设备中的核心技术,它允许在单个芯片上...
《Combine Asynchronous Programming in Swift 2nd》是针对Swift编程语言的第二版,专注于iOS、macOS和iPhone应用开发中的后台异步编程技术。这本书详细介绍了如何利用Swift的 Combine 框架进行高效的并发和事件处理...
在电机控制领域,异步电机(也称为感应电机)因其结构简单、运行可靠而被广泛应用。...这种模型对于电机控制理论的学习和实践具有重要的价值,能够帮助研究人员和工程师更好地理解和优化电机的运行性能。
在这个名为"FIFO_-asynchronous-master.zip"的压缩包中,包含了使用Verilog语言实现的异步FIFO设计。Verilog是一种硬件描述语言,它允许设计者以结构化的方式描述数字系统的功能和行为,无论是简单的逻辑门还是复杂...
标题“The-asynchronous-call.rar_The Call”提示我们,这个压缩包可能包含与异步调用相关的资源,可能是代码示例、教程或者API文档。 异步调用通常涉及到以下几个核心概念: 1. **回调函数(Callback Function)*...