之前用swoole(1.7.19)写的一段程序在数据量大的时候存在内存泄漏,改为twisted(15.4)实现,自测无误,记录如下(两者cpu占用率90%时吞吐rps能从120提升到1000)。

#!/usr/bin/env python

from twisted.internet import task, reactor
from twisted.python import log
from twisted.web import static, server, resource
import MySQLdb
import json class RotateMap(object):
def __init__(self):
self.using = 0
self.unuse = 1
self.map = [{},{}] def find(self, key):
if self.map[self.using].has_key(key):
return self.map[self.using][key]
return False def set(self, nmap):
self.map[self.unuse] = nmap
self._swap() def get(self):
return self.map[self.using] def _swap(self):
self.using,self.unuse = self.unuse,self.using check = RotateMap()
allow = RotateMap()
start = RotateMap() log.startLogging(open("/tmp/tserver.log",'w')) class TServer(resource.Resource):
isLeaf = True
def getChild(self, name, request):
if name == '':
return self
return Resource.getChild(self, name, request) def render_GET(self, request):
if request.requestHeaders.hasHeader("x-forwarded-for"):
log.msg("%s %s %s" % (request.requestHeaders.getRawHeaders("x-forwarded-for"), request.path, json.dumps(request.args)))
else:
log.msg("%s %s %s" % ("127.0.0.1", request.path, json.dumps(request.args))) if "/api1" == request.path:
if request.args.has_key("version"):
version = request.args["version"][0]
if version != "":
global start
info = start.get()
result = {}
if info["version"] != version:
result["needUp"] = True
result["version"] = info
else:
result["needUp"] = False return json.dumps(result) elif "/api2" == request.path:
host = ""
if request.args.has_key("host"):
host = request.args["host"][0]
global check
if host != "":
v1 = check.find(host)
if v1 == False:
v1 = ""
return "%s" % (v1) elif "/api3" == request.path:
host = ""
if request.args.has_key("host"):
host = request.args["host"][0]
v1 = v2 = 1
global allow
if host != "" and allow.find(host) != False:
v1 = 0
return "%d|%d" % (v1,v2) elif "/reload" == request.path:
cmd = "file"
if request.args.has_key("cmd"):
cmd = request.args["cmd"][0]
helper = ReloadHelper()
helper.reload(cmd)
return "done"
else:
request.setResponseCode(404)
return "404 not found" request.setResponseCode(400)
return "400 bad request" class ReloadHelper(object):
def reload(self, cmd):
log.msg("reload %s start" % (cmd))
if cmd == "db":
self._reloadDB()
elif cmd == "file":
self._reloadFile()
log.msg("reload %s end" % (cmd)) def _reloadFile(self):
data = {}
f = open("check.data")
line = f.readline()
while line:
domain, levelid = line.strip().split("|")
data[domain] = levelid
line = f.readline()
f.close()
global check
check.set(data) data = {}
f = open("allow.data")
line = f.readline()
while line:
domain = line.strip()
data[domain] = ""
line = f.readline()
f.close()
global allow
allow.set(data) def _reloadDB(self):
try:
conn=MySQLdb.connect(host='hostname',user='username',passwd='passwd',port=3306)
conn.select_db("dbname")
cur = conn.cursor()
cur.execute("set names utf8")
cur.execute("SELECT id, version, name FROM table ORDER BY id DESC LIMIT 1")
row = cur.fetchone()
if len(row) == 3:
data = {}
data["id"] = row[0]
data["version"] = row[1]
data["name"] = row[2]
global start
start.set(data)
cur.close()
conn.close()
except MySQLdb.Error, e:
log.err("mysql error %d, %s" %(e.args[0], e.args[1])) helper = ReloadHelper()
l = task.LoopingCall(helper.reload, "db")
l.start(600) l = task.LoopingCall(helper.reload, "file")
l.start(3600000) def main():
tserver = static.File("/usr/local/nginx/html")
tserver.putChild("service", TServer())
tserver.putChild("html", static.File("/usr/nginx/html")) reactor.listenTCP(8080, server.Site(tserver), 50, "127.0.0.1")
reactor.run() if __name__ == '__main__':
main()

twisted的一些代码的更多相关文章

  1. Python Twisted系列教程10:增强defer功能的客户端

    作者:dave@http://krondo.com/an-introduction-to-asynchronous-programming-and-twisted/ 译者:杨晓伟(采用意译) 可以从这 ...

  2. Python Twisted系列教程9:第二个小插曲,Deferred

    作者:dave@http://krondo.com/a-second-interlude-deferred/ 译者:杨晓伟(采用意译) 可以从这里从头来阅读这个系列 更多关于回调的知识 稍微停下来再思 ...

  3. Python 开源异步并发框架的未来

    http://segmentfault.com/a/1190000000471602 开源 Python 是开源的,介绍的这几个框架 Twisted.Tornado.Gevent 和 tulip 也都 ...

  4. Tornado模块分类和各模块之间的关系

    1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 tornado.https ...

  5. tornado源码分析-模块介绍

    1.Core web framework tornado.web - web框架功能模块,包括RequestHandler和Application两个重要的类 tornado.httpserver - ...

  6. Tornado模块分类

    Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...

  7. Tornado 模块概述

    Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...

  8. Python框架之Tornado(概述)

    本系列博文计划: 1.剖析基于Python的Web框架Tornado的源码,为何要阅读源码? Tornado 由前 google 员工开发,代码非常精练,实现也很轻巧,加上清晰的注释和丰富的 demo ...

  9. 一个在交流群里讨论过两轮的问题,答案竟然跟一个 PEP 有关

    Python 中有没有办法通过类方法找到其所属的类? 这个问题看起来不容易理解,我可以给出一个例子: class Test: @xxx def foo(self): pass 现在有一个类和一个类方法 ...

随机推荐

  1. [转]前端利器:SASS基础与Compass入门

    [转]前端利器:SASS基础与Compass入门 SASS是Syntactically Awesome Stylesheete Sass的缩写,它是css的一个开发工具,提供了很多便利和简单的语法,让 ...

  2. git解决冲突

    解决冲突 人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a ...

  3. Linux进程间通信——使用消息队列

    下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道   一.什么是消息队列 消息队列提 ...

  4. iOS多线程系列(1)

    多线程这个概念的接触是蛮早的时候了,当时还是单核单CPU的时候,Thread这个概念已经出现了,当时比较流行的方案是时间片轮流,线程可以优先级抢占,但一次只能运行一个线程,实际上多线程是不能真正并行处 ...

  5. CGFloat,CGPoint,CGSize,CGRect

    1.数据类型: CGFloat: 浮点值的基本类型 CGPoint: 表示一个二维坐标系中的点 CGSize: 表示一个矩形的宽度和高度 CGRect: 表示一个矩形的位置和大小 typedef fl ...

  6. 帮助中心 7D-我的私家设计师 设计师品牌服饰集成网 7D服装定制!

    帮助中心 7D-我的私家设计师 设计师品牌服饰集成网 7D服装定制! 关于我们

  7. HM中CU,TU的划分

    相信只要是做算法改进的,首先都会遇到这么一个问题:CU,PU及TU这几个在HM中该如何打印出它们最终的划分情况呢?也经常有人来问我这个问题,一般来说,因为问我的时候我一般手头都没有现成的代码可以提供, ...

  8. jQuery插件

    1. Lightbox 2:    Lightbox 2 是一款很酷的图片显示插件,可以在一个平滑展开的新窗口中展现出图片,而同时页面的其余部分都变成黑色背景.使用这款插件,是为了当你的的图片过大必须 ...

  9. DOM注意事项(八):JavaScript操作环境和垃圾收集

    一.运行环境 在约JavaScript对象或this当指向问题,念就是运行环境.即上下文环境.运行环境在JavaScript是一个非常重要的概念.由于它定义了变量或函数有权訪问的其他数据,决定了它们各 ...

  10. 解决ubuntu 14.04删ibus导致系统设置项目的损失后,,退出关机问题是不正常的

    已安装sogou第一篇文章.嫌ibus碍眼,习惯性删.我没想到会引起一系列问题.退出登录用户崩溃.系统设置非常多的项目. 它似乎ubuntu 14.04于ibus它不能被卸载(卸载iBus本身没有问题 ...