【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
rpc作为pc之间通信的工具,极大地提高了我们运行的速率和方法。一般来说,如果rpc和fabric、supervisor配合使用的话,会给我们的工作带来极大地方便。此外,很多同学喜欢用多进程代替多线程,我想这其中除了多进程可以防止服务终止之外,另外一个原因就是多进程可以有效地扩展为分布式系统。这一点对于那些业务量比较大的公司来说,还是很有吸引力的。
之前,我们也写过rpc的代码。但是,原来rpc的操作都是基于twisted库,很多同学未必了解这个库。其实python本身也提供了rpc的基本操作。英文好一点的同学可以看这份在线文档,上面说的很清楚。当然希望快速上手的同学,可以看看下面的代码。它的server是这么写的,
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
requestHandler=RequestHandler)
server.register_introspection_functions()
# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)
# Register a function under a different name
def adder_function(x,y):
return x + y
server.register_function(adder_function, 'add')
# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'div').
class MyFuncs:
def div(self, x, y):
return x // y
server.register_instance(MyFuncs())
# Run the server's main loop
server.serve_forever()
server代码中主要就是注册了pow、adder_function、MyFuncs这三部分的内容,其他的就没有啥了。
import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.pow(2,3) # Returns 2**3 = 8
print s.add(2,3) # Returns 5
print s.div(5,2) # Returns 5//2 = 2
# Print list of available methods
print s.system.listMethods()
client部分的内容就更简单了,主要就是使用server提供的几个函数。其实大家可以反过来看。如果我们想自己写一个分布式系统,那么完全可以采用多server+client的形式来完成。按照这种模式,如果client希望server执行某种工作,可以先upload代码到server处,请server重新reload,接着就按照需求请求server来处理了。当然,如果在本地测试这个多server+client的分布式代码,只需要将分布式的ip注册成为不同的端口就可以了,道理其实是一样的。