轻量级web server Tornado代码分析

tornado实现高性能无阻塞udp通信(1)——server端实现 在高性能web架构中,往往需要在多个组件之间进行通信 阅读详情

最近在做项目,使用了Tornado这个用python写的由Facebook开源出来的web服务器框架。
这确实是一个轻量级的框架,只需要几行代码,直接运行脚本,就可以建立起一个server了。
Tornado使用了epoll方式,在linux环境下,用了epoll的,总是受到更多的关注,呵呵。
这比我们销售短信项目中使用的c++ Poco库使用的poll模型效率要高一些。
再加上python语言本身强大的脚本能力,灰度发布从代码行数上来讲,非常得少。
没有括号而依赖缩进的规则,使得Tornado的源代码看起来也比较舒服,而且他们均出自牛人之手,确实是学习网络编程的好对象。


Tornado采用多进程 + 非阻塞 + epoll的模型,可以提供比较强大的网络响应性能。
在我们的项目中,单个实例的灰度发布server就可以支持每秒1500次的请求响应。
而通过Nginx与tornado一起部署,可以同时支持多个实例的运行,从而支持加倍的请求响应,满足当前旺旺用户的升级需求。
下图是旺旺灰度发布的架构图:

 
现在把Tornado里面的部分内容,以及一些重要的资料分享给大家,有兴趣的同学可以玩一下。


1 Tornado来历

Tornado是一个开源的网络服务器框架,该平台基于社交聚合网站FriendFeed的实时信息服务开发而来。
2007年,4名谷歌前软件工程师一起创办了FriendFeed,旨在使用户能方便地跟踪好友在Facebook和Twitter等多个社交网站上的活动。
结果两年后,Facebook宣布收购FriendFeed,这一交易的价格约为5000万美元。而此时,FriendFeed只有12名员工。
据说这帮人后来又到了Google,搞出了现在的Google App Engine …… 


Tornado由Python编写,跟其他主流的Web服务器框架不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。
Tornado当前版本为2.1.1,官方网站为http://www.tornadoweb.org/,有兴趣的同学可以去尝试一下。

2 Tornado简介

Tornado主要包含了如下四部分内容。官方的帮助文档,实际上只是源码注释的集合。大家直接看源码就可以了。

今天主要和大家分享一下HTTP SERVER的相关内容。

 

2.1 Tornado HTTP SERVER

使用Tornado可以很方便地架构出各种类型的web服务器。
我们现在从HTTP服务器入手,来看一下它的实现。
下面这张图大家应该见得很多了,是所有web server的一般工作方式。

l  服务器端bind到一个端口,然后开始listen。

l  客户端connect上来以后,将请求发送给服务端。

l  服务端处理完成后返回给客户端。

这样,一个请求就处理结束了。
不过,当需要处理成千上万的连接的时候,我们就会在这个基础上考虑更多的情况。
这也就是大家熟悉的The C10K problem。

一般大家会有如下一些选择:

l  一个线程服务多个客户端,使用非阻塞I/O和水平触发的就绪通知

l  一个线程服务多个客户端,使用非阻塞I/O和就绪改变时通知

l  一个服务线程服务多个客户端,使用异步I/O

l  一个服务线程服务一个客户端,使用阻塞I/O

l  把服务代码编译进内核

Tornado采用的就是:多进程 + 非阻塞 + epoll模型


下面这张图基本上就显示了Tornado与网络相关的所有内容了:

 

2.2 第一个HTTP server例子

下面是官网提供的一个hello world的代码示范。

import tornado.ioloop

import tornado.web

class MainHandler(tornado.web.RequestHandler):

    def get(self):

        self.write("Hello, world")


application = tornado.web.Application([

    (r"/", MainHandler),

])

if __name__ == "__main__":

    application.listen(8888)

    tornado.ioloop.IOLoop.instance().start()


实现非常简单, 只需要定义自己的处理方法, 其它的东西全部交给Tornado完成。
首先创建web application, 并把我们的处理方法MainHandler传递过去。
然后在8888开始监听。
最后启动事件循环, 开始监听网络事件,主要是socket的读和写。

Python又是这样一种便捷的语言,上面这段代码直接贴到文本中,无需编译,就可以直接运行,一个server就产生了。


2.3 模块分析

我们接下来将逐个分析这部分代码。首先对Tornado有个全面的了解。Tornado服务器有3大核心模块:

(1) IOLoop

  从上面的代码可能看出,Tornado为了实现高并发和高性能, 使用了一个IOLoop来处理socket的读写事件, 
 IOLoop基于epoll, 可以高效的响应网络事件. 这是Tornado高效的保证. 

(2) IOStream

  为了在处理请求的时候, 实现对socket的异步读写, Tornado实现了IOStream类, 用来处理socket的异步读写。

(3) HTTPConnection

  这个类用来处理http的请求,包括读取http请求头,读取post过来的数据,调用用户自定义的处理方法,以及把响应数据写给客户端socket。

下面这幅图描述了tornado服务器的大体处理流程, 接下来我们将会详细分析每一步流程的实现。

 

 

3 源码分析

3.1 bind和listen

服务器的第一步就是bind。
Httpserver.py的bind函数可以看到一个标准的服务器启动过程:

def bind(self, port, address=None, family=socket.AF_UNSPEC):

        if address == "":

            address = None

                   // 查找网卡信息

        for res in socket.getaddrinfo(address, port, family, socket.SOCK_STREAM,

                                      0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG):

            af, socktype, proto, canonname, sockaddr = res

            sock = socket.socket(af, socktype, proto)

            flags = fcntl.fcntl(sock.fileno(), fcntl.F_GETFD)

            flags |= fcntl.FD_CLOEXEC

            fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, flags)

            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            if af == socket.AF_INET6:

                if hasattr(socket, "IPPROTO_IPV6"):

                    sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)

            sock.setblocking(0)

                            // bind和listen

            sock.bind(sockaddr)

            sock.listen(128)

            self._sockets[sock.fileno()] = sock

                   // 加入io_loop

            if self._started:

                self.io_loop.add_handler(sock.fileno(), self._handle_events,

                                         ioloop.IOLoop.READ)


   

for循环保证对每张网卡上的请求都得到监听。
对于每个网卡,先建立socket,然后bind listen,最后将socket加入到
io_loop,
注册的事件是ioloop.IOLoop.READ,也就是读事件。程序中还添加了对ipv6的处理。
回调函数为_handle_events, 一旦listen socket可读, 说明客户端请求到来, 然后调用_handle_events接受客户端的请求。
接下来,看一下_handle_events是怎么处理的。

3.2 accept

接上一节,Httpserver.py的_handle_events函数实现了accept的过程。代码如下:


    def _handle_events(self, fd, events):

        while True:

            try:

                connection, address = self._sockets[fd].accept()

            except socket.error, e:

                if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):

                    return

                raise

            if self.ssl_options is not None:

                                   //这里有一段处理ssl的代码,比较长,省略

            try:

                stream = iostream.IOStream(connection, io_loop=self.io_loop)

                HTTPConnection(stream, address, self.request_callback,

                               self.no_keep_alive, self.xheaders)

            except:

                logging.error("Error in connection callback", exc_info=True)

accept方法返回客户端的socket, 以及客户端的地址。
然后创建IOStream对象, 用来处理socket的异步读写. 这一步会调用ioloop.add_handler把client socket加入ioloop,再然后创建HTTPConnection, 处理用户的请求。
接下来,我们看下iostream和httpconnection。


3.3 iostream

为了实现对client socket的异步读写, 需要为client socket创建两个缓冲区: _read_buffer和_write_buffer,这样我们就不用直接读写socket,进而实现异步读写。
这些操作都封装在IOStream类中。概括来说,IOStream对socket的读写做了一层封装,通过使用两个缓冲区,实现对socket的异步读写。

IOStream与socket是一一对应的, 在iosteram.py可以找到iosteram的init方法:

    def __init__(self, socket, io_loop=None, max_buffer_size=104857600,

                 read_chunk_size=4096):

        self.socket = socket

        self.socket.setblocking(False)

        self.io_loop = io_loop or ioloop.IOLoop.instance()

        self._read_buffer = collections.deque()

        self._write_buffer = collections.deque()

        self._state = self.io_loop.ERROR

        with stack_context.NullContext():

            self.io_loop.add_handler(

                self.socket.fileno(), self._handle_events, self._state)

可以看到,初始化的时候建立了两个buffer,然后把自己的socket放到了io_loop。
这样,当这个socket有读写的时候,就会回调到注册的事件self._handle_events里面了。
_handle_events就很容易理解了,代码如下:

    def _handle_events(self, fd, events):

        if not self.socket:

            logging.warning("Got events for closed stream %d", fd)

            return

        try:

            if events & self.io_loop.READ:

                self._handle_read()

            if events & self.io_loop.WRITE:

                self._handle_write()

            if events & self.io_loop.ERROR:

                self.io_loop.add_callback(self.close)

                return

            state = self.io_loop.ERROR

            if self.reading():

                state |= self.io_loop.READ

            if self.writing():

                state |= self.io_loop.WRITE

            if state != self._state:

                self._state = state

                self.io_loop.update_handler(self.socket.fileno(), self._state)

        except:

            logging.error("Uncaught exception, closing connection.",

                          exc_info=True)

            self.close()

            raise

3.4 ioloop

在Tornado服务器中,IOLoop是调度的核心模块,
​Tornado服务器回把所有的socket描述符都注册到IOLoop, 注册的时候指明回调处理函数,
​IOLoop内部不断的监听IO事件, 一旦发现某个socket可读写, 就调用其注册时指定的回调函数。
​ IOLoop使用了单例模式。

在Tornado运行的整个过程中,只有一个IOLoop实例,仅需一个 IOLoop实例, 就可以处理全部的IO事件。
​上文中多次用到了ioloop.IOLoop.instance()这个方法。它会返回ioloop的一个单例。


​下面这段代码,可以看到python是怎么定义一个单例的。代码中使用了cls,这不是一个关键字,
​和self一样,cls是python的一个built-in变量,self表示类的实例,而cls表示类。
​所以大家看了几个函数会发现,python的成员函数的第一个参数,不是self就是cls。 

class IOLoop(object):

    def instance(cls):

        if not hasattr(cls, "_instance"):

            cls._instance = cls()

        return cls._instance

    def initialized(cls):

        return hasattr(cls, "_instance")

def start(self):

        if self._stopped:

            self._stopped = False

            return

        self._running = True

 

        while True:

            poll_timeout = 0.2

            callbacks = self._callbacks

            self._callbacks = []

            for callback in callbacks:

                self._run_callback(callback)

 

            try:

                event_pairs = self._impl.poll(poll_timeout)

            except Exception, e:

                if (getattr(e, 'errno', None) == errno.EINTR or

                    (isinstance(getattr(e, 'args', None), tuple) and

                     len(e.args) == 2 and e.args[0] == errno.EINTR)):

                    continue

                else:

                    raise

 

            if self._blocking_signal_threshold is not None:

                signal.setitimer(signal.ITIMER_REAL,

                                 self._blocking_signal_threshold, 0)

            self._events.update(event_pairs)

 

            while self._events:

                fd, events = self._events.popitem()

                self._handlers[fd](fd, events)

 

        self._stopped = False

        if self._blocking_signal_threshold is not None:

            signal.setitimer(signal.ITIMER_REAL, 0, 0)


这里的poll根据不同的系统环境,支持select、epoll和KQueue三种模式。
​下面是epoll模式的处理:


class _EPoll(object):

    _EPOLL_CTL_ADD = 1

    _EPOLL_CTL_DEL = 2

    _EPOLL_CTL_MOD = 3

 

    def __init__(self):

        self._epoll_fd = epoll.epoll_create()

 

    def fileno(self):

        return self._epoll_fd

 

    def register(self, fd, events):

       epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_ADD, fd, events)

 

    def modify(self, fd, events):

        epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_MOD, fd, events)

 

    def unregister(self, fd):

        epoll.epoll_ctl(self._epoll_fd, self._EPOLL_CTL_DEL, fd, 0)

 

    def poll(self, timeout):

        return epoll.epoll_wait(self._epoll_fd, int(timeout * 1000))


4 性能比较

这是一段官网上的描述:

“一个 Web 应用的性能表现,主要看它的整体架构,而不仅仅是前端的表现。
​和其它的 Python Web 框架相比,Tornado 的速度要快很多。
​我们在一些流行的 Python Web 框架上(Django、web.py、CherryPy),针对最简单的 Hello, world 例子作了一个测试。
​对于 Django 和 web.py,我们使用 Apache/mod_wsgi 的方式来带,CherryPy 就让它自己裸跑。这也是在生产环境中各框架常用的部署方案。
​
​对于我们的 Tornado,使用的部署方案为前端使用nginx 做反向代理,带动 4 个线程模式的 Tornado,
​这种方案也是我们推荐的在生产环境下的 Tornado 部署方案
​(根据具体的硬件情况,我们推荐一个 CPU 核对应一个 Tornado 伺服实例,我们的负载测试使用的是四核处理器)。
​我们使用 Apache Benchmark (ab),在另外一台机器上使用了如下指令进行负载测试:

ab -n 100000 -c 25 http://10.0.1.x/

在 AMD Opteron 2.4GHz 的四核机器上,结果如下图所示:

在我们的测试当中,相较于第二快的服务器,Tornado 在数据上的表现也是它的 4 倍之多。
​即使只用了一个 CPU 核的裸跑模式,Tornado 也有 33% 的优势。”

 

使用同样的参数,对旺旺灰度发布服务器测试结果如下:

ab -n 20000 -c 50 'http://10.20.147.160:8080/redirect?uid=cnalichntest&ver=6.05.10&ctx=alitalk&site=cnalichn'

配置nginx + 1个tornado服务器的时候:Requests per second:    672.55 [#/sec] (mean)

配置nginx + 4个tornado服务器的时候:Requests per second:    2187.45 [#/sec] (mean)

手把手教你用Foobar2000播放DSD音频(含DOP设置与SPDIF输出教程) 本文详细指导如何在Foobar2000中播放DSD音频,重点解析了DOP协议的原理与设置方法。通过安装SACD插件、配置输出设备及启用DOP模式,实现DSD音频的原生比特流输出,并特别讲解了如何通过SPDIF接口传输DSD信号,帮助发烧友充分释放高清音频设备的潜力。 阅读详情

相关推荐

Lora无线温湿度传感器方案

综上所述,Lora无线温湿度传感器以其长距离传输、低功耗、高稳定性、精准测量、无线传输以及广泛的应用场景等特点,在环境监测领域展现出了强大的竞争力和广泛的应用前景。Lora无线温湿度传感器广泛应用于各种需要远程监控和数据采集的场景,如仓储、农业、机房、楼宇、交通、工业、矿产、电力等领域。Lora无线温湿度传感器是一种采用Lora无线通信技术进行数据传输的温湿度监测设备。四、产品参数(以某款工业级Lora温湿度传感器为例)

weixin_46632654的博客 759

Tornado web server 初体验

1. Tornado 是什么? Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。 详见中文官网:http://www.tornadoweb.cn/ 2. 在ubuntu下安装Tornado并测试官网给出的HelloWorld程序 2.1 自动安装 命令: pip intstall tornado 由于我刚开始使用Pyt

YorkCai的专栏 7988

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

实践,用tornado实现自定义协议server

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34208283的博客 237

江科大51单片机笔记【1】单片机及开发板介绍

单片机,Micro Controller Unit,简称MCU,内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(传感器)、处理(CPU)和硬件设备(电机、LED)的控制单片机算是一个袖珍版计算机,是一个完整的计算机系统,成本低体积小结构简单单片机的使用领域:智能仪表、实时工控、通讯设备、导航系统、家用电器等。

2301_80195807的博客 838

Matlab 轴承信号仿真+分析

文章目录项目说明1、信号仿真1.1 仿真公式1.2 信号参数设置1.3 代码实现2、仿真信号分析2.1 小波变换2.2 快速谱峭度 项目说明 本文主要解决两个问题: 1、仿真包含周期性冲击信号、随机干扰冲击信号、调制干扰信号以及随机噪声四个成分的故障轴承信号; 2、使用小波变换以及快速谱峭度对该仿真信号进行分析。 1、信号仿真 1.1 仿真公式 这里的仿真信号公式主要参考了包文杰学者的硕士论文《加权谱峭度故障诊断方法研究与应用》,列举公式如下: 周期性冲击信号仿真 随机干扰冲击信号仿真 调制

cocofisher的博客 9267

基于tornado的异步TCPServer以及TCPClient

背景 关于tornado,我这里就不详细讲了,有兴趣的同学可以通过以下两篇博客了解一下:  http://yunjianfei.iteye.com/blog/2185476 http://yunjianfei.iteye.com/blog/2185446 我们一般用tornado来编写web程序,但实际上,tornado底层的代码非常优秀,也可以用这些代码来编写TCP应用。   ...

Dreaming 1169

华为OD技术面真题 - Python开发 - 1

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 1719

tornado之多进程服务

tornado多进程开启 在前文中简单介绍过tornado的基本使用。tornado默认启动的是单进程,启动方式如下: if __name__ == "__main__": application = tornado.web.Application([(r"/", MainHandler)]) # application.listen(8888) server = HTTPServer(application) server.listen(8888) tornado.

xiaoyi52的专栏 2735

AUTOSAR内存篇 -内存驱动(Mem)

Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。

IOT2017的博客 714

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

[zz] 轻量级web server Tornado代码分析

最近不是在学习tornado嘛,随手bing了一把,找到一篇很好的文章,放到这里留做记录。 全文转载自“上善若水”的博客。 http://blog.youkuaiyun.com/goldlevi/article/details/7047726   最近在做项目,使用了Tornado这个用python写的由Facebook开源出来的web服务器框架。这确实是一个轻量级的框架,只需要几行代码,直接运行脚本,...

Luciano9esu的专栏 248

Python爬虫实战:Boss直聘职位数据采集实战 - Playwright + 结构化解析完整方案(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 2188

Tornado:高性能异步Web框架详解

在Web开发的广阔领域中,处理高并发和实时性需求一直是开发者们面临的挑战。Tornado,作为一个由FriendFeed(后被Facebook收购)开发的Python Web框架,以其非阻塞的I/O操作和异步网络库而著称,成为构建高性能、实时Web服务的理想选择。Tornado是一个高性能的异步Web框架,适用于需要处理大量并发请求和实时交互的应用场景。通过非阻塞I/O和异步编程模式,Tornado能够提供出色的性能和可扩展性。因此,Tornado的代码库相对较小,易于学习和使用。然后,我们创建了一个。

Aaron_945的博客 2033

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

推荐开源项目:Tornado Web Server - 高性能的Python网络库和框架

推荐开源项目:Tornado Web Server - 高性能的Python网络库和框架 【免费下载链接】tornado 项目地址: https://gitcode.com/gh_mirrors/tor/tornado ...

gitblog_00329的博客 656

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Tornado框架基础 -- (一)Tornado的介绍

1.什么是Tornado? 全称为Tornado Web Server,是一种Web服务器软件的开源版本。 2.特点 (1)作为Web框架,是一个轻量级的Web框架。类似于另一个web框架Web.py,其拥有异步非阻塞IO的处理方式。 (2)作为Web服务器,Tornado有较为出色的抗负载能力。 3.使用场景 (1)用户量大,高并发。 (2)大量的HTTP持久连接。 ...

Leo的博客 1918

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

tornado linux 离线,Web服务器 Tornado

Tornado Web Server 是使用Python编写出來的一个极轻量级、高可伸缩性和非阻塞IO的Web服务器软件,著名的 Friendfeed 网站就是使用它搭建的。Tornado 跟其他主流的Web服务器框架(主要是Python框架)不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。要使用它,必须按照以下套件:1)Python(建议使用Pytho...

weixin_31935793的博客 202

初识tornado

初识tornado 什么是tornado ​ 全称 Tornado Web Server , 是一个用Python编写的开源异步HTTP服务器,同时也是一个web开发框架 特点 作为web框架,是一个轻量级的web框架,其拥有异步非阻塞IO的处理方式 作为web服务器,Tornado有较为出色的抗负载能力,官方用tornado和其他python web框架做对比,结果最大...

SuperGirlNo1的博客 459

java 轻量级 httpserver_java轻量级Http Server

lighttpd官方主页:www.lighttpd.netLighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, ...

weixin_28867883的博客 709

http file server模板_Tornado表单与模板

我们学习了使用Tornado创建了一个Web应用的基础知识。包括处理函数,HTTP方法以及Tornado框架的总体结构。今天在这里,我们将学习一些你在创建Web应用时经常会用到的更强大的功能。和大多数Web框架一样,Tornado的一个重要目标就是帮助您重新地编程程序,重新整洁地替换更多的代码。甚至Tornado足够灵活,可以使用几乎所有的Python支持的模板语言,Tornado本身...

weixin_39768388的博客 239

Tornado异步Web框架深度解析:从核心原理到高并发实战

异步编程是现代高性能Web应用的核心技术之一,它通过非阻塞I/O模型,允许单个线程同时处理多个网络连接,从而显著提升系统的并发处理能力。其核心原理在于事件循环机制,该机制持续监听I/O事件并调度相应的回调函数或协程执行,避免了传统同步模式中线程阻塞导致的资源浪费。这一技术价值在于能够以更少的资源开销支撑更高的并发连接数,特别适用于实时聊天、消息推送、API网关等I/O密集型场景。Tornado作为Python生态中成熟的异步Web框架,其一体化异步设计从底层网络库到HTTP服务器均提供了原生支持,结合asy

weixin_34268579的博客 1459

java轻量级Http Server

lighttpd 官方主页:www.lighttpd.netLighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth

网生代 1507

Django、Flask、Tornado框架选型实战指南

Web框架是构建服务端应用的核心基础设施,其本质是HTTP请求处理、路由分发、中间件编排与异步IO调度的技术载体。理解Django的全栈约定、Flask的显式可拆卸设计和Tornado的单线程事件循环原理,有助于规避N+1查询、上下文丢失、连接池耗尽等高频工程陷阱。三者技术价值迥异:Django胜在开箱即用的生产就绪能力,Flask强于轻量嵌入与微服务解耦,Tornado专精高并发长连接场景。典型应用场景包括内部管理系统(Django admin)、边缘设备API(Flask单文件部署)、实时协作服务(To

weixin_33901926的博客 366
上一篇: Redhat Linux下的python版本升级
下一篇: python升级安装后的yum的修复
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值