部分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 学习笔记(二)的更多相关文章

  1. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

  2. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  3. (10.1)Python学习笔记二

    1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...

  4. Tornado/Python 学习笔记(一)

    1.源代码下载及安装:http://www.tornadoweb.org/en/stable/ 2.python中xmlrpc库官方文档:https://docs.python.org/3/libra ...

  5. Python学习笔记二

    ---恢复内容开始--- 一. python几种数据类型的比较. 从以下几个方面比较: 1. 是否可变. 不可变类型:变量的值可以发生变化,id也变了,相当于创建了一个新的对象,所以一修改值,id就变 ...

  6. Python学习笔记(二)

    标识符和关键字 1,邮箱的Python标识符是任意长度的非空字符序列(引导字符+后续字符.) python标识符必须符合两条规则--标识符区分大小写 (1)只要是unicode编码字母都可以充当引导字 ...

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

    上一篇博客写了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法.一.数据类型是什么鬼?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各 ...

  8. python学习笔记二:流程控制

    一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...

  9. python 学习笔记二 (列表推导式)

    2018年年初写了第一篇博客,说要做一个认真的技术人 https://www.cnblogs.com/yingchen/p/8455507.html 今天已经是11月19日了,这是第二篇博客,看来坚持 ...

随机推荐

  1. 微信小程序组件 加减号弹出框

    <!-- 点击立即抢拼弹出框 --> <view class='add-rob' bindtap="setModalStatus" data-status=&qu ...

  2. perf的采样模式和统计模式

    perf的采样模式和统计模式 统计模式和采样模式使用寄存器的方法不相同; 在统计模式下,每次调度之前设置寄存器,调度之后清理寄存器,留个下个进程使用;PMU寄存器的使用方法; 在采样模式下,每次 pm ...

  3. SpringMVC 应知应会

    springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...

  4. 【.Net】C# 将Access中时间段条件查询的数据添加到ListView中

    一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加 ...

  5. java中的error该不该捕获

    写java程序时,通常会被提示捕获异常,而又有一些异常是不需要强制捕获的,这是一个被说烂了的话题.像我一样从其他语言转过来的人确实有点迷惑,那我以我的理解重新解释一遍吧. 异常的基类是Exceptio ...

  6. C++解析(6):函数参数的扩展

    0.目录 1.函数参数的默认值 2.函数默认参数的规则 3.函数占位参数 4.小结 1.函数参数的默认值 C++可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的 ...

  7. KMPnext数组自看

    emm...无数次再看kmp了 因为一直没做相关的题..看了就忘看了就忘..emm.. next[i]表示去掉第i个元素后,自已的前缀和后缀完全匹配的最大长度 例 字符串 a b a b a b z ...

  8. 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  9. 【刷题】洛谷 P3806【模板】点分治1

    题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...

  10. 【JQuery】事件

    一.前言        接着上一章选择器的知识,继续啊jQuery的学习 二.内容 $(function(){}) 文档初始化加载 event.pageX 相对于文档左边缘的鼠标位置 event.pa ...