Tornado/Python 学习笔记(二)

部分ssrpc.py代码分析 -- 服务端:

 1 #!/usr/bin/python3
 2
 3 from xmlrpc.client import Fault, dumps, loads
 4 import sys
 5 from socketserver import ForkingMixIn
 6 from xmlrpc.server import SimpleXMLRPCServer
 7
 8 class VerboseFaultXMLRPCServer(SimpleXMLRPCServer):
 9     def _marshaled_dispatch(self, data, dispatch_method = None, path = None):
10         """Dispatches an XML-RPC method from marshalled (XML) data.
11
12         XML-RPC methods are dispatched from the marshalled (XML) data
13         using the _dispatch method and the result is returned as
14         marshalled data. For backwards compatibility, a dispatch
15         function can be provided as an argument (see comment in
16         SimpleXMLRPCRequestHandler.do_POST) but overriding the
17         existing method through subclassing is the preferred means
18         of changing method dispatch behavior.
19         """
20
21         try:
22             params, method = loads(data)
23
24             # generate response
25             if dispatch_method is not None:
26                 response = dispatch_method(method, params)
27             else:
28                 response = self._dispatch(method, params)
29             # wrap response in a singleton tuple
30             response = (response,)
31             response = dumps(response, methodresponse=1,
32                              allow_none=self.allow_none, encoding=self.encoding)
33         except Fault as fault:
34             response = dumps(fault, allow_none=self.allow_none,
35                              encoding=self.encoding)
36         except:
37             # report exception back to server
38             exc_type, exc_value, exc_tb = sys.exc_info()
39             while exc_tb.tb_next is not None:
40                 exc_tb = exc_tb.tb_next  # find last frame of the traceback
41             lineno = exc_tb.tb_lineno
42             code = exc_tb.tb_frame.f_code
43             filename = code.co_filename
44             name = code.co_name
45             response = dumps(
46                 Fault(1, "%s:%s FILENAME: %s LINE: %s NAME: %s" % (
47                     exc_type, exc_value, filename, lineno, name)),
48                 encoding=self.encoding, allow_none=self.allow_none,
49                 )
50
51         return response.encode(self.encoding)
52
53 # One process per request
54 class ForkingXMLRPCServer(ForkingMixIn, VerboseFaultXMLRPCServer):
55     max_children = 500    # default is 40
56
57 server = ForkingXMLRPCServer(("", 8889), allow_none=True)
58
59 # Register functions here
60
61 from ssapi.disk.sas import sasdiskinfo
62 from ssapi.disk.ledctl import ledctl_set
63 from ssapi.zfs.zpoollist import zpoollist
64 from ssapi.zfs.zpoolstatus import zpoolstatus
65 from ssapi.zfs.zpoolcreate import zpoolcreate
66
67 funcs = [
68     sasdiskinfo,
69     ledctl_set,
70     zpoollist,
71     zpoolstatus,
72     zpoolcreate,
73     ]
74
75 for i in funcs:
76     server.register_function(i)
77
78 # Start service
79 server.serve_forever()

正如上篇文章所述,SimpleXMLRPCServer是一个单线程的服务器,所以这里支持多进程的方式如下:

1.定义VerboseFaultXMLRPCServer类,继承于SimpleXMLRPCServer

2.定义一个新类:ForkingXMLRPCServer(ForkingMixIn, VerboseFaultXMLRPCServer),其中ForkingMixIn是从socketserver中导入

3.调用新类创建server实体,server = ForkingXMLRPCServer(("", 8889), allow_none=True),则支持多进程

/usr/lib/python3.2/xmlrpc/server.py 中SimpleXMLRPCServer源代码:

 1 class SimpleXMLRPCServer(socketserver.TCPServer,
 2                          SimpleXMLRPCDispatcher):
 3     """Simple XML-RPC server.
 4
 5     Simple XML-RPC server that allows functions and a single instance
 6     to be installed to handle requests. The default implementation
 7     attempts to dispatch XML-RPC calls to the functions or instance
 8     installed in the server. Override the _dispatch method inherited
 9     from SimpleXMLRPCDispatcher to change this behavior.
10     """
11
12     allow_reuse_address = True
13
14     # Warning: this is for debugging purposes only! Never set this to True in
15     # production code, as will be sending out sensitive information (exception
16     # and stack trace details) when exceptions are raised inside
17     # SimpleXMLRPCRequestHandler.do_POST
18     _send_traceback_header = False
19
20     def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
21                  logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
22         self.logRequests = logRequests
23
24         SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
25         socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate)
26
27         # [Bug #1222790] If possible, set close-on-exec flag; if a
28         # method spawns a subprocess, the subprocess shouldn‘t have
29         # the listening socket open.
30         if fcntl is not None and hasattr(fcntl, ‘FD_CLOEXEC‘):
31             flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
32             flags |= fcntl.FD_CLOEXEC
33             fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)

Tornado/Python 学习笔记(二)

时间: 2024-10-20 20:12:54

Tornado/Python 学习笔记(二)的相关文章

Tornado/Python 学习笔记(一)

1.源代码下载及安装:http://www.tornadoweb.org/en/stable/ 2.python中xmlrpc库官方文档:https://docs.python.org/3/library/xmlrpc.html?highlight=xmlrpc 3.xml介绍与学习:http://www.w3school.com.cn/xml/xml_intro.asp XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显示数据,其焦点是数据的外观. HTML 旨在显示

Python学习笔记<二>:列表、元组、字典

1 列表和元组 可以将列表和元组当成普通的"数组",它能保存任意数量任意类型的Python 对象.和数组一样,通过从0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象. 列表和元组有几处重要的区别.列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变.元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以).元组可以看成是只读的列表.通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样. 举例如下: >>>

python学习笔记(二)

一.版本问题 python2与python3是目前主要的两个版本. python3.0版本较之前的有很大变动,而且不向下兼容. Python 2.7作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移.即2.7版本兼容2.x和3.0的语法 Python 2.7保持了对之前版本的全兼容,而且还包含了Python 3.0的新玩意(一些新特性需要通过"from __future__ import"来启用). 如果想要在python2.7中使用:p

python学习笔记(二) - 函数

一. 调用函数 python内置了一些数据类型转换函数,比如int()函数可以把其他数据类型转换为整形 >>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>> unicode(100) u'100' >>> bool(1) True >>> bool('') Fal

python学习笔记二:IDE环境搭建

工欲善其事,必先利其器.每个IDE都有自己的优点,适合的才是最好的. [伯乐在线]Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程.Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这些 Python 开发工具帮助开发者加快使用 Python 开发的速度,提高效率.高效的代码编辑器或者 IDE 应该会提供插件,工具等能帮助开发者高效开发的特性.最好的 10 款 Python IDEs,这里详细介绍前两

python学习笔记二:流程控制

一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print 'a+' else: print 'a' elif x >= 80: if x >= 85: print 'b+' else: print 'b' elif x >= 70: if x >= 75: print 'c+' else: print 'c' else: if x >

python学习笔记(二):python数据类型

上一篇博客写了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法.一.数据类型是什么鬼?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型.二.整形和浮点型整形也就是整数类型(int)的,在python3中都是int类型,没有什么long类型的,比如说存年龄.工资.成绩等等这样的数据就可以用int类型,有正

python学习笔记二:if语句及循环语句,断点,模块,pyc

if语句 注意:语句块中的内容要强制缩进,否则出错.IndentationError,缩进错误 所有代码,如果是顶级的,必须顶格写,前面不能有空格 if - : - elif - : - else: - while语句 while -: - else: - for语句 for i in range(10)--i默认0,步长默认1,最大为9 for i in range (0,2,10)--从0开始,步长为2,最大为8 for  i   in range(-): - else: - break--

Python学习笔记(二)Python语法_1

[[email protected] ~]# ipython In [1]: import platform In [2]: print platform.uname() ('Linux', 'kaibin.test1', '2.6.32-431.el6.x86_64', '#1 SMP Fri Nov 22 03:15:09 UTC 2013', 'x86_64', 'x86_64') In [3]: dir(platform)        #查看platform支持的功能:dir(plat