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. phpstudy 配置 memcached / memcache

    https://blog.csdn.net/zql898626913/article/details/77309269

  2. [ASE][Daily Scrum]11.10

    明天就是一年一度的光棍节了 提前提醒各位已经有妹子蓝孩子藏好自己的银行卡. 涛哥上周回家去了,进度上稍有一些耽搁不过今天就能补完所以影响不严重. 此外纠正我(PM-poor man)之前一个错误,我之 ...

  3. Golang Email

    Backup Code I dont have chinese inputmethod now ( what the fuck about Linux KDE envirnment !) , so j ...

  4. 第5件事 做一个有taste的产品人

    1.taste的意思是品位,也就是说产品经理应该是一个有品位的产品人.什么叫品位呢?品位指的是对事物有分辨与鉴赏的能力.品位是形象的展示,品位是内在气质的复出,品位是人生价值的体验,品位是道德修养的内 ...

  5. 托管博客到coding或者github

    1. 部署网站到github的pages服务 参考: <在Github上面搭建Hexo博客(一):部署到Github> <Hexo搭建独立博客,托管到Github和Coding上教程 ...

  6. .NET MVC 学习笔记(二)— Bootstrap框架

    二..NET MVC 学习笔记(一)—— Bootstrap框架 在实际开发过程中,页面的样式问题是让人很头疼的问题,良好的用户界面可以大大提高用户体检,而在你没有前端开发人员的火力支援情况下,并不是 ...

  7. java实现点选汉字验证码

    package com.rd.p2p.web; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; im ...

  8. Spring Boot中使用Swagger2构建RESTful API文档

    在开发rest api的时候,为了减少与其他团队平时开发期间的频繁沟通成本,传统做法我们会创建一份RESTful API文档来记录所有接口细节,然而这样的做法有以下几个问题: 1.由于接口众多,并且细 ...

  9. linux服务器的相关信息查看(端口占用,cpu、内存占用,防火墙,系统信息,vim编辑器使用等)

    一.端口占用情况   https://www.cnblogs.com/CEO-H/p/7794306.html (1)查看所有端口.进程的使用情况:netstat -tunlp (2)查看某一端口的使 ...

  10. UI的设计,适配器,以及RecyclerView无法加载的解决办法

    这本书里讲到的界面设计都是用最基本的方式实现的,即编写xml文件 所有的控件都具有宽度和高度属性,即android:layout_width和android:layout_height,这两个属性对应 ...