`
joy2everyone
  • 浏览: 136320 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

python学习笔记 - asynchronous@tornado 学习记录二

阅读更多
继续笔记下关于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。


笔记先分享到这里,欢迎大家讨论,共同学习







分享到:
评论

相关推荐

    python-3.6.8-amd64.exe

    - ASGI(Asynchronous Server Gateway Interface)支持,为Python Web应用提供异步I/O。 - 新的优化编译模式,可以提升某些类型代码的运行速度。 - 以及对Type Annotations的增强,为静态类型检查提供更好的支持。 ...

    jee6 学习笔记 6.3 - @Asynchronous

    在Java企业版(Java EE)6中,`@Asynchronous`注解是一个非常重要的特性,它使得开发者可以方便地在应用程序中实现异步处理。这个注解是Java EE并发编程的一部分,主要应用于EJB(Enterprise JavaBeans)环境,用于...

    python-3.7.3-amd64.rar

    同时,学习如何使用Python的标准库和第三方库,如Numpy、Pandas、Matplotlib等,可以极大地提高开发效率。对于想要在PlatformIO IDE中开发的用户,熟悉相关硬件平台的驱动和通信协议,以及如何在Python中控制这些...

    跨平台 Python 异步聊天机器人框架 - Asynchronous multi-platf-nonebot2.zip

    跨平台 Python 异步聊天机器人框架 - Asynchronous multi-platf-nonebot2

    Python库 | prerender-python-starlette-1.0.0.tar.gz

    Starlette是Python中的一个轻量级的ASGI(Asynchronous Server Gateway Interface)框架,它允许开发者创建高性能的异步Web应用。ASGI是Python社区为处理现代Web应用的高并发需求而设计的标准接口。Starlette以其...

    python-3.7.0-docs-html

    2. **异步编程(Asynchronous Programming)**:Python 3.7 对异步IO模型进行了优化,如 `asyncio` 模块,使得编写高性能的并发代码变得更加简洁。新增了 `async` 和 `await` 关键字,让协程(coroutines)的使用...

    python-3.7.3-amd64.zip|python-3.7.3-amd64.zip

    Python 3.7.3不仅为开发者提供了强大的功能,而且由于其易读性强和丰富的生态系统,使其成为学习编程的理想选择。在使用过程中,如果遇到官网下载速度慢的问题,可以从可靠的第三方源获取像"python-3.7.3-amd64.zip...

    基于python3.6 + tornado 实现简单的 RESTful API,用于机器学习模型部署和调用.zip

    在本项目中,我们主要探讨如何使用Python 3.6版本和Tornado框架来构建一个简单的RESTful API,以便于部署和调用机器学习模型。RESTful API是一种遵循Representational State Transfer (REST)架构风格的Web服务设计...

    python-3.7-docs-html

    3. **异步生成器(Asynchronous Generators)**:Python 3.7 引入了异步生成器,允许在 `asyncio` 库中使用 `yield from` 语法,这使得异步代码的编写更加灵活和高效。 4. **更安全的随机数生成**:`random` 模块在...

    Python库 | tencentcloud-sdk-python-taf-3.0.562.tar.gz

    **Python库 | tencentcloud-sdk-python-taf-3.0.562.tar.gz** 本文将详细介绍关于`tencentcloud-sdk-python-taf-3.0.562`的使用和相关知识点,它是一个针对腾讯云服务的Python SDK,允许开发者在Python环境中便捷地...

    JavaScript高级程序设计2,学习笔记---第一篇

    这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...

    Python---源码剖析.rar

    10. **并发和异步(Concurrency and Asynchronous)**:Python的并发模型,如线程、进程和协程,是通过源码可以深入了解的复杂主题。特别是对于Python的全局解释器锁(GIL),理解其工作原理对于优化多线程程序有...

    Python-提供一个web界面检测主机是否在线

    页面与后端Python代码的交互通常通过AJAX(Asynchronous JavaScript and XML)完成,这样可以在不刷新整个页面的情况下更新内容。 在服务器端,Python应用接收请求,解析请求中的主机名,然后调用ping函数。如果...

    xapp523-lvds-4x-asynchronous-oversampling

    本应用笔记中描述的电路提供了一种“部分解决方案”,即虽然没有实际恢复出时钟,但可以完全提取到达的数据。图1展示了一个典型的使用场景。 #### 7系列FPGA中的LVDS 4倍异步过采样 在Xilinx 7系列FPGA中,...

    python1903笔记 06-web前端.zip

    通过学习以上知识点,并结合Python1903笔记06-web前端的压缩包内容,你可以建立起对Web前端开发的全面理解,为进一步深入Python Web开发打下坚实基础。记得实践是检验真理的唯一标准,理论学习的同时,动手编写代码...

    A-Designer-s-Guide-to-Asynchronous-VLSI_vlsi_asynchronous_

    《异步VLSI设计指南》是一本深入探讨复杂集成电路设计领域的专著,主要关注的是异步电路的设计方法。VLSI(Very Large Scale Integration)指的是超大规模集成电路,是现代电子设备中的核心技术,它允许在单个芯片上...

    combine-asynchronous-programming-swift-2nd

    《Combine Asynchronous Programming in Swift 2nd》是针对Swift编程语言的第二版,专注于iOS、macOS和iPhone应用开发中的后台异步编程技术。这本书详细介绍了如何利用Swift的 Combine 框架进行高效的并发和事件处理...

    Dq0-asynchronous-motor-simulation.zip_decoupling motor_stator_定转

    在电机控制领域,异步电机(也称为感应电机)因其结构简单、运行可靠而被广泛应用。...这种模型对于电机控制理论的学习和实践具有重要的价值,能够帮助研究人员和工程师更好地理解和优化电机的运行性能。

    FIFO_-asynchronous-master.zip

    在这个名为"FIFO_-asynchronous-master.zip"的压缩包中,包含了使用Verilog语言实现的异步FIFO设计。Verilog是一种硬件描述语言,它允许设计者以结构化的方式描述数字系统的功能和行为,无论是简单的逻辑门还是复杂...

    The-asynchronous-call.rar_The Call

    标题“The-asynchronous-call.rar_The Call”提示我们,这个压缩包可能包含与异步调用相关的资源,可能是代码示例、教程或者API文档。 异步调用通常涉及到以下几个核心概念: 1. **回调函数(Callback Function)*...

Global site tag (gtag.js) - Google Analytics