使用tornado做个能承担高负载的接口,配置部分是否要使用配置文件(ConfigParser)。现在有两个问题需要测试。第一、配置文件是否一次性加载,我可不希望,每次调用都会加载配置文件。第二、修改配置文件是否可以自动加载。在tornado中py文件可以自动加载,这样服务就不需要重启,服务也不会间断。
首先是做一个tornado的测试页。在目录opt下建立testconfig文件夹,在testconf下编写代码。共有4个文件。
主文件 main.py 代码如下:
#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------------------------------------------------------
# Filename: main.py
# Revision: 1.0
# Date: 2012-11-18
# Author: simonzhang
# Email: simon-zzm@163.com
# Web: www.simonzhang.net
# -----------------------------------------------------------------------------
import tornado.ioloop
import tornado.web
from index import *
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
主文件要调用的部分 index.py 代码如下:
#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------------------------------------------------------
# Filename: main.py
# Revision: 1.0
# Date: 2012-11-18
# Author: simonzhang
# Email: simon-zzm@163.com
# Web: www.simonzhang.net
# -----------------------------------------------------------------------------
import tornado.ioloop
import tornado.web
import ConfigParser
# 配置进行全局加载,如果是放到类中肯定每次都有IO。
cf = ConfigParser.ConfigParser()
cf.read("config.properties")
get_index_file_path = cf.get(cf.sections()[0], "path")
class MainHandler(tornado.web.RequestHandler):
def get(self):
read_file = open(get_index_file_path, "rb").read()
self.write("%s" % read_file)
配置文件名为config.properties内容如下:
[context_path]
path = index.txt
创建一个index.txt文件,在里面写点要显示的文件。
开始编写监控配置文件IO的脚本。监控文件变化的部分详见:http://www.simonzhang.net/?p=429。还不知道watchdog能不能做到这个。
脚本名为 watchfile.py 代码如下:
#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------------------------------------------------------
# Filename: watchfile.py
# Revision: 1.0
# Date: 2012-11-17
# Author: simonzhang
# Email: simon-zzm@163.com
# Web: www.simonzhang.net
# -----------------------------------------------------------------------------
import re
import pyinotify
wm = pyinotify.WatchManager()
mask = pyinotify.IN_OPEN
class EventHandler(pyinotify.ProcessEvent):
def process_IN_OPEN(self, event):
self.rebuild(event)
def rebuild(self, event):
if (event.dir == False) and (event.name == 'config.properties') :
print "open config file"
def main():
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch('/opt/testconfig',mask, rec=True,auto_add=True )
notifier.loop()
if __name__ == "__main__":
main()
最终测试结果。第一、配置文件是在服务启动时一次加载。第二、配置文件不能自动加载,修改完配置文件必须要重启服务。
使用ConfigParser来做配置文件,自然非常方便,tornado重启速度很快,但是我还是希望能自动加载,因为在几百台服务的情况下,能自动加载自然比需要重启更方便。所以当前就是把配置直接写到代码中,然后找个文件记录配置位置。之后再研究一下能不能热重启。如果大家有好的办法也烦请请告诉我一声。