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. poj 2676 如何填满九宫格

    Sudoku Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class ...

  2. UITableView横向滚动

    UITableView 设置 CGRect tableViewRect = CGRectMake(0.0, 0.0, 50.0, 320.0); self.tableView = [[UITableV ...

  3. 软件测试思维导图[ZZ]

    原文链接 全图

  4. C#常用修饰符

    访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性,C#有4个访问修饰符:public.private.protected.internal,使用这些访问修饰符可以指定以下5个访问 ...

  5. 背水一战 Windows 10 (44) - 控件(日期类): CalendarView, DatePicker, TimePicker

    [源码下载] 背水一战 Windows 10 (44) - 控件(日期类): CalendarView, DatePicker, TimePicker 作者:webabcd 介绍背水一战 Window ...

  6. 浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序

    本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析 ...

  7. ffplay源码分析5-图像格式转换

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10311376.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...

  8. 移动端font-size适配方案(续)

    概述 之前写过一篇移动端font-size适配方案,但是在实践过程中,还是发现当时的思维太局限了,视野太窄了,所以现在补充更新一下,记录下来,供以后开发时参考,相信对其他人也有用. 我上一篇博文主要有 ...

  9. underscore.js源码研究(4)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  10. Metasploit中数据库的密码查看以及使用pgadmin远程连接数据库

    我们都知道,在msf下进行渗透测试工作的时候,可以将结果数据保存到数据库中,方便各个小组成员在渗透测试过程中的数据同步. 例如,Metasploit提供了db_nmap命令,它能够将Nmap扫描结果直 ...