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

#!/usr/bin/env pythonfrom twisted.internet import task, reactor
from twisted.python import log
from twisted.web import static, server, resource
import MySQLdb
import jsonclass RotateMap(object):def __init__(self):self.using = 0self.unuse = 1self.map = [{},{}]def find(self, key):if self.map[self.using].has_key(key):return self.map[self.using][key]return Falsedef set(self, nmap):self.map[self.unuse] = nmapself._swap()def get(self):return self.map[self.using]def _swap(self):self.using,self.unuse = self.unuse,self.usingcheck = RotateMap()
allow = RotateMap()
start = RotateMap()log.startLogging(open("/tmp/tserver.log",'w'))class TServer(resource.Resource):isLeaf = Truedef getChild(self, name, request):if name == '':return selfreturn 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 startinfo = start.get()result = {}if info["version"] != version:result["needUp"] = Trueresult["version"] = infoelse:result["needUp"] = Falsereturn json.dumps(result)elif "/api2" == request.path:host = ""if request.args.has_key("host"):host = request.args["host"][0]global checkif host != "":v1 = check.find(host)if v1 == False:v1 = "0"return "%s" % (v1)elif "/api3" == request.path:host = ""if request.args.has_key("host"):host = request.args["host"][0]v1 = v2 = 1global allowif host != "" and allow.find(host) != False:v1 = 0return "%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] = levelidline = f.readline()f.close()global checkcheck.set(data)data = {}f = open("allow.data")line = f.readline()while line:domain = line.strip()data[domain] = "0"line = f.readline()f.close()global allowallow.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 startstart.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()

转载于:https://www.cnblogs.com/ciaos/p/4869602.html

twisted的一些代码相关推荐

  1. twisted系列教程九–Deferred 的第二个小插曲

    More Consequence of Callbacks 我们将要再来研究一下callback,尽管我们已经对deferred比较了解而且已经可以写出twisted 风格的异步程序,Deferred ...

  2. Twisted入门教程(9)

    第九部分:第二个小插曲,Deferred 可以从这里从头来阅读这个系列. 更多关于回调的知识 稍微停下来再思考一下回调的机制.尽管对于以Twisted方式使用Deferred写一个简单的异步程序已经非 ...

  3. Twisted入门教程(10)

    2019独角兽企业重金招聘Python工程师标准>>> 第十部分:增强defer功能的客户端 可以从这里从头开始阅读这个系列. 版本5.0 现在我们将要向诗歌下载客户端添加一些新的处 ...

  4. twisted学习笔记

    1.twisted 的异步基于Deferreds对象 使用twisted 编写异步代码时要先导入defer 和reactor from twisted.internet import defer, r ...

  5. Twisted 入门 教程

    GitHub 地址:https://github.com/likebeta/twisted-intro-cn/tree/master/zh             https://github.com ...

  6. 用python写王字_看这里!Python之web之王!

    Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. Tornado与现 ...

  7. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

  8. twisted系列教程十五–测试twisted代码

    Introduction 在这个系列中我们也已经写了很多twisted 代码了,但目前为止我们忽略了一个很重要的事情-测试.你可能也一直在想我们怎样用一个同步的测试框架unitest来测试我们的异步的 ...

  9. python twisted教程_python-twisted模块代码实例

    Twisted 模块提供了很方便的多任务通信.通过创建协议类来实现. # 客户端 #!/usr/bin/python #coding=utf-8 from twisted.internet impor ...

最新文章

  1. java-第十一章-类的无参方法-计算器运算
  2. 给SQL数据库表和字段添加描述信息
  3. Androidstudio SVN安装与使用
  4. ES6新特性之class类的基本语法
  5. 《Web全栈工程师的自我修养》
  6. NET Core 指令启动
  7. VMware8 8.0.1 安装Lion正式版 原版镜像 直接DMG安装 非整合版 免引导 完美解决iCloud...
  8. 面试官:备战年终,这些面试考点,请你牢牢记住
  9. 小鹏汽车窃密特斯拉实锤?前员工回应:确实上传过30万份Autopilot源码
  10. php 复选框 未选,php – 在表单发布时如何获取复选框元素中未选中复选框的值?...
  11. DWR学习笔记 - Hello World
  12. OrzFAng系列–树 解题报告
  13. 详解!智能工厂物流系统规划步骤
  14. MCSA Windows Server 2016 Complete Study Guide, 2nd Edition 免积分下载
  15. 歌谷服务套件gms_谷歌gms框架安装器下载-安卓9谷歌服务框架app安装-游戏大玩家...
  16. Kafka C++客户端库librdkafka详解
  17. 计算机网络从使用对象上划分为,计算机网络练习题卷1-2章.doc
  18. Centos7恢复xfs删除文件
  19. 怎么取消linux ssh互信,[系统-linux] ssh互信操作
  20. 深蓝学院-视觉SLAM理论与实践-第十二期-第2章作业

热门文章

  1. 行业分析 - .波特五力模型分析
  2. canvas中的清空画布
  3. 3.Oralce的基础操作
  4. How I built a wind map with WebGL 源码理解(没完)
  5. PR-你终究要学的运营神器
  6. [音乐] The Mass(魔界传奇) (转)
  7. Android使EditText和SearchView取消默认焦点,获取焦点弹出键盘
  8. 怎么注册企业邮箱?外贸用什么邮箱比较好?
  9. 华硕编程竞赛11月JAVA专场 C题太空遨游 题解
  10. 2019年从业者眼中的互金走向