总结体会:

options这个文件是用来管理程序运行过程中配置的,它采用了单例模式,整个程序运行时只有一个实例存在。

参数可以从命令行读取,也可以从配置文件中读取,就看你怎么用了。

同时,options这个类也被tornado自己所用,存放了一些运行时的所需的参数(我只看了log.py文件,日志的一些参数的确用了options)。

实现原理:

options单例化的对象时OptionParser,OptionParser的组成:

1 一个名叫_options名称的字典对象,其中每个对象的内容都是_Option实例对象。

2 _parse_callbacks名称的列表对象,目前从定义上讲应该是回调函数的列表。

然后接着说_Option类,它实际是定义了一种数据对象格式,包括name,type,help,metavar,multiple,file_name,group_name,callback,default,_value,这些变量是作者认为在使用时可能需要定义的。

代码分段:

经过上面分析,我个人认为应该把options.py代码分为以下几段(除去了文件头import部分):

1 类OptionParser:options存储对象的类

2 类_Mockable:这其实是作者针对依赖库变化打的补丁,我们暂时不需要考虑

 class _Mockable(object):
"""`mock.patch` compatible wrapper for `OptionParser`. As of ``mock`` version 1.0.1, when an object uses ``__getattr__``
hooks instead of ``__dict__``, ``patch.__exit__`` tries to delete
the attribute it set instead of setting a new one (assuming that
the object does not catpure ``__setattr__``, so the patch
created a new attribute in ``__dict__``). _Mockable's getattr and setattr pass through to the underlying
OptionParser, and delattr undoes the effect of a previous setattr.
"""
def __init__(self, options):
# Modify __dict__ directly to bypass __setattr__
self.__dict__['_options'] = options
self.__dict__['_originals'] = {} def __getattr__(self, name):
return getattr(self._options, name) def __setattr__(self, name, value):
assert name not in self._originals, "don't reuse mockable objects"
self._originals[name] = getattr(self._options, name)
setattr(self._options, name, value) def __delattr__(self, name):
setattr(self._options, name, self._originals.pop(name))

3 类_Option:用于OptionParse的需求对象

4 options = OptionParser() :实例化OptionParse对象

 options = OptionParser()
"""Global options object. All defined options are available as attributes on this object.
"""

5 接口区:用于对配置对象options做操作,这里的诸多函数实际上是对options对象内部函数的一个封装。注意:实例化在这里有意义了,它们是对4步options对象直接做操作,而不是对类做操作

 def define(name, default=None, type=None, help=None, metavar=None,
multiple=False, group=None, callback=None):
"""Defines an option in the global namespace. See `OptionParser.define`.
"""
return options.define(name, default=default, type=type, help=help,
metavar=metavar, multiple=multiple, group=group,
callback=callback) def parse_command_line(args=None, final=True):
"""Parses global options from the command line. See `OptionParser.parse_command_line`.
"""
return options.parse_command_line(args, final=final) def parse_config_file(path, final=True):
"""Parses global options from a config file. See `OptionParser.parse_config_file`.
"""
return options.parse_config_file(path, final=final) def print_help(file=None):
"""Prints all the command line options to stderr (or another file). See `OptionParser.print_help`.
"""
return options.print_help(file) def add_parse_callback(callback):
"""Adds a parse callback, to be invoked when option parsing is done. See `OptionParser.add_parse_callback`
"""
options.add_parse_callback(callback)

6 调用函数define_logging_options(options):这里就是tornado自己的默认运行参数了,主要是日志。指向log.py里面的一些预先设置好的配置

 # Default options
define_logging_options(options)

我们跳到log.py看函数是怎么写的

 def define_logging_options(options=None):
"""Add logging-related flags to ``options``. These options are present automatically on the default options instance;
this method is only necessary if you have created your own `.OptionParser`. .. versionadded:: 4.2
This function existed in prior versions but was broken and undocumented until 4.2.
"""
if options is None:
# late import to prevent cycle
import tornado.options
options = tornado.options.options
options.define("logging", default="info",
help=("Set the Python log level. If 'none', tornado won't touch the "
"logging configuration."),
metavar="debug|info|warning|error|none")
options.define("log_to_stderr", type=bool, default=None,
help=("Send log output to stderr (colorized if possible). "
"By default use stderr if --log_file_prefix is not set and "
"no other logging is configured."))
options.define("log_file_prefix", type=str, default=None, metavar="PATH",
help=("Path prefix for log files. "
"Note that if you are running multiple tornado processes, "
"log_file_prefix must be different for each of them (e.g. "
"include the port number)"))
options.define("log_file_max_size", type=int, default=100 * 1000 * 1000,
help="max size of log files before rollover")
options.define("log_file_num_backups", type=int, default=10,
help="number of log files to keep") options.define("log_rotate_when", type=str, default='midnight',
help=("specify the type of TimedRotatingFileHandler interval "
"other options:('S', 'M', 'H', 'D', 'W0'-'W6')"))
options.define("log_rotate_interval", type=int, default=1,
help="The interval value of timed rotating") options.define("log_rotate_mode", type=str, default='size',
help="The mode of rotating files(time or size)") options.add_parse_callback(lambda: enable_pretty_logging(options))

类OptionParser和类_Option我将在下一步单独说明

本文部分内容借鉴了:

http://blog.csdn.net/wgw335363240/article/details/50755782

tornado架构分析2 options.py实现原理的更多相关文章

  1. tornado架构分析3 options.py中基础类_Option

    1 数据清洗 option里面最重要的方法就是parse,在这里,parse函数的一开始就调用了后面的子函数_parse_datetime,_parse_timedelta,_parse_bool,_ ...

  2. tornado架构分析1 从helloworld分析tornado架构

    最近公司需要我写一个高性能RESTful服务组件.我之前很少涉及这种高性能服务器架构,帮公司和平时没事玩都是写脚本级别的东西.虽然好多基础组件(sphinx.logging.configparse等) ...

  3. 万字长文:ELK(V7)部署与架构分析

    ELK(7版本)部署与架构分析 1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日 ...

  4. SLG手游Java服务器的设计与开发——架构分析

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  5. 从SpringBoot源码分析 配置文件的加载原理和优先级

    本文从SpringBoot源码分析 配置文件的加载原理和配置文件的优先级     跟入源码之前,先提一个问题:   SpringBoot 既可以加载指定目录下的配置文件获取配置项,也可以通过启动参数( ...

  6. Net6 Configuration & Options 源码分析 Part2 Options

    Net6 Configuration & Options 源码分析 Part2 Options 第二部分主要记录Options 模型 OptionsConfigurationServiceCo ...

  7. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  8. Magento架构分析,Magento MVC 设计分析

    Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...

  9. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...

随机推荐

  1. SDL中 so库的使用

    用到的项目:Tocy-Android-SDLv2 JAVA层:只有一个 SDLActivity.java 路径\Android-SDLv2\src\org\libsdl\app 项目简单分析: 默认在 ...

  2. SDL2.0.9源码分析

    1.首先 2.0.9编译so出来跟一直不一样,多了个hidapi  库 2.跟Tocy的对比,SDLmain 执行的路径不一样,一个是/src/main/android/SDL_android_mai ...

  3. Go Example--json

    package main import ( "encoding/json" "fmt" "os" ) type Response1 stru ...

  4. JavaScript自定义事件 - createEvent()、initEvent()和dispachEvent()

    在学习目标事件的方法的时候,接触到了dispatchEvent()方法.度娘查一查,这是一个事件触发器,事件触发器其实就是触发事件的东西. 通常情况下,我们触发事件都是在交互中触发的事件,例如点击按钮 ...

  5. linux的基本操作(一)

    一.Linux组成 1.1:Linux各模块介绍 内核:是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序. Shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收 ...

  6. mysql数据备份及恢复

    备份工具 mysqldump mysqldump是mysql和mariadb上最好的备份工具之一,免费开源. mysqldump 首先查询每个数据库和每个表的结构与数据,然后把查出的所有内容导出到文本 ...

  7. Eclipse中Java build path的使用

    1.Eclipse中,工程属性的Java Build Path的Library标签页下,有如下几个按钮:Add Jars...添加JAR包,是指本Eclipse当前包含的工程中的,在工程列表下选取即可 ...

  8. Unity3D外包 团队更新一下UE4和Unity3D案例

    欢迎联系我们索取,谢谢! 有项目外包请联系QQ:372900288 索取案例.

  9. E4A 与JS交互事件无反应

    今天碰到一个问题,E4A与JS的交互,调用JS函数后,事件没有任何反应,给JS赋值,会看到浏览框中有内容显示,但是事件为什么就没反应呢. 把官方的例程打开编译试了也不行. 后来在群中问了,原来是这里设 ...

  10. vmware上虚拟机:Network error: Connection refused 排查

    问题分析 vmware配置的fedora虚拟机, 主机能ping通虚拟机, 虚拟机也能ping通主机.但是用PUTTY连接虚拟机的时候出现 Network error: Connection refu ...