1.问题

上个学期,给学校写了一个数据服务,主要从oracle里面读取一些数据供查询使用,非常快速的用web.py搭建了起来。调试顺利,测试正常,上线!接下来就是挨骂了,我铁定知道会卡,但是没想到会那么卡。在线10几个人就已经无法访问了。我自己这里调试还是可以正常访问的,那就是负载量不够呗。上nginx,起8个进程。好了不少喂,但是还是有学生抱怨,时而正常,时而不正常。我就知道,快速完成的东西,大量用户的东西,这次web.py有些顶不住了,期间还不死心上了一些组件来优化进程访问,不一一细说,因为都没有明显好转,啥独角兽,啥uwsgi,啥fastCGI,统统效果不明显。肯定也是我水平不够。这时候不得不再拿出几年前用来解决异步请求的tornado来。

2.啥是异步问题

以web.py为例,一般性开发管理系统由于使用的用户比较少,几乎可以忽略这个问题,或者通过增加负载用多进程来解决这个问题,因为一个简单的小系统同时又8~10人在线使用就很不错了。web.py在单个进程服务的时候,如果一个请求消耗的时间很长,另外的请求就会被阻塞,等待第一个请求得到响应完成后才会被响应,这就是阻塞问题,解决阻塞问题的方法就是启用异步请求。本来在其他开发语言里这是个简单的问题,但是在python里,因为Python自身的设计就是单进程的,稍微麻烦了一些,仔细研究还有很多好玩的事情。

3.我的解决

第一步是换一个支持异步的tornado,第二步是在tornado中启用异步。tornado的异步也有不少的方法,但是从应用角度来看,我觉得最终我选择的这个方法对于原有系统结构的冲击比较小。

3.1 创建响应请求的基类WxBaseView

#coding=utf-8
__author__ = 'jy@cjlu.edu.cn'
from concurrent.futures import ThreadPoolExecutor
from tornado.web import RequestHandler
from web.utils import storage
opt_users = d_users()
class WxBaseView(RequestHandler):
executor = ThreadPoolExecutor(100)

3.2 所有url实现类继承这个基类

#coding=utf-8
from tornado.concurrent import run_on_executor
class List(WxBaseView):
@run_on_executor
def get(self):
self.set_header("Content-Type", "text/html; charset=UTF-8")
self.set_header("Access-Control-Allow-Origin", "*")
self.write("hello tornado!")
@run_on_executor
def post(self):
self.write("hello tornado!")

这里注意一个要点,就是在响应函数get和post前增加@run_on_executor这个装饰器,而这个装饰器其实调用的是我们在基类里设置的ThreadPoolExecutor,这里我们设置了这个线程池是100个。

4.对于web.py项目迁移到tornado

这个的修订方法对于解决用web.py快速开发的业务系统来说,代价非常的小,而且上线效果马上见效,比啥优化都有效。因为你再也不用因为一个耗时请求卡住整个进程了。100个线程池已经足以对付300个以上的在线用户了。

用python写web一定要去破解的异步请求问题.经历web.py和tornado,完破!的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. python写zip破解器

    浏览桌面依然平静,!!!!等等..怎么有个压缩包 打开一看!!!156.txt???waht the fuck? 卧槽还有密码!!!!!! 但是我不知道╮(╯▽╰)╭该怎么办呢! 很简单,python ...

  3. python 写的http后台弱口令爆破工具

    今天来弄一个后台破解的Python小程序,哈哈,直接上代码吧,都有注释~~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  4. python写的一个集合

    起因:原本打算用python写一个抢火车票的脚本.在那 期间遇见各种浏览器驱动失败的节奏....打算先缓一下 然后就去写集合了. 0x01 源码: # -*- coding:'utf-8' -*- # ...

  5. python写机器人玩僵尸骰子

    python写机器人玩僵尸骰子由Al Sweigart用python发布注意:我正在为我的僵尸骰子模拟器寻找反馈,以及这一套指令.如果你觉得有什么地方可以改进,请发邮件到al@inventwithpy ...

  6. Python写的微服务如何融入Spring Cloud体系?

    前言 在今天的文章中小码哥将会给大家分享一个目前工作中遇到的一个比较有趣的案例,就是如何将Python写的微服务融入到以Java技术栈为主的Spring Cloud微服务体系中?也许有朋友会有疑问,到 ...

  7. Python写各大聊天系统的屏蔽脏话功能原理

    Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...

  8. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  9. python写一个邮箱伪造脚本

    前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...

随机推荐

  1. Python自动化开发 - 面向对象(一)

    本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...

  2. brctl命令

    有五台主机.其中一台主机装有linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机.我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1 ...

  3. RNN以及LSTM的介绍和公式梳理

    前言 好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RN ...

  4. cnn的说明

    概述 前面的练习中,解决了一些有关低分辨率图像的问题,比如:小块图像,手写数字小幅图像等.在这部分中,我们将把已知的方法扩展到实际应用中更加常见的大图像数据集. 全联通网络 在稀疏自编码章节中,我们介 ...

  5. 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象

    本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...

  6. ASP.NET MVC5 高级编程-学习日记-第一章 入门

    1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.1.1 MVC模式 ...

  7. 用一个应用场景理解ASP.NET Core Identity是什么?

    目录 前言 基于声明的认证(Claims-based Authentication) 应用场景一 在ASP.NET Core 中Identity是如何实现的 类ClaimsPrincipal 考察另外 ...

  8. AJPFX讲解外汇保证金交易的货币符号和外汇的报价方式

    AJPFX:外汇保证金交易的货币符号 认识货币名字是必须的入门基础,通过货币符号,首先要知道买卖哪个货币,下面是一些货币的符号.买卖外汇就是这些任意其中某两种货币的比值,也就是汇率.根据汇率比的升高或 ...

  9. 第十三章 ReentrantLock 简介

    Java 5.0 提供的新的加锁机制:当内置加锁机制不适合时 , 作为一种可选择的高级功能 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一 ...

  10. Vue过渡动画—Vue学习笔记

    要求:要通过Vue使用过渡动画我们要把需要过度的元素放在<transition name='变量名'></transition>中. 原理:通过在特定的时刻增加/移除样式实现. ...