python Pyro(python中的RMI)学习笔记一

来源:互联网 发布:汇丰软件 劝退 编辑:程序博客网 时间:2024/06/10 09:47
点击查看官方文档资料
Pyro的学习很不方便,这方面的资料很少,即使能找到也仅有英文的,而且也不多。只能从官方文档里学习了,不过在pyro的svn有不少绝佳的例子。
我用的是第三版的pyro,
前三个部分就不介绍了,下载,setup都很简单。
下面我介绍Pyro Usage
1,被远程调用的一定是一个class类,并且__init__不能被调用
2,返回值要是能被pickled的,想是file类型的就不能。pyro的连接是可持续的
3,server端的类要继承Pyro.core.ObjBase
def __init__(self):              Pyro.core.ObjBase.__init__(self)    ...

 或者是impl = MyRemoteClass()
obj = Pyro.core.ObjBase()
obj.delegateTo(impl)然后连接obj跟Daemon

4 结束退出,daemon.shutdown()
断开连接
self.getDaemon().disconnect(object)     # can also pass object's UIDdel object5,回调的时候用Pyro.core.CallbackObjBase,6,def __iadd__(self.value):
   self.value+=value
    returnself
)不过在RMI中这个要改成return self.getAttrProxy()
7,如果要调用到其他的远程项目,最好是是采取多线程技术.


Introduction
其实按照pyro上提供的那个简单例子,很多都可以了解了,
如果的sever已经注册了一个class,可以用pyro-nsc来解注册或者重启
Pyro script tools
pyro有两种风格的命令行,unix与windows。其中win风格的是以.cmd后缀结尾的。
pyro-genguid(GUID generator)
   没有参数,这个是十分简单的
pyro-ns(Name Server)
pyro-es(Event Server)
pyro-nsc(Name Server Control tool)
   参数列表[-h host][-p port][-cbcaddr][-i identification] command [args..]
  大部分没什么好解释的,其中bcaddr是指,允许你重载broadcastaddress广播地址。如果这些信息中包含有空格,就用引号包起来。
'command' is one of the following:
  • ping: 看Name Server开了没
  • list: prints the contents of a name group. Argument is thegroup name to list.
  • listall: prints a list of all registered names (expanded).
  • register: 注册一个新的名字,参数是name和URI.
  • resolve: 查找Name. Arguments are the names to search for.
  • remove: remove registered names from the NS. Arguments are thenames to remove.
  • creategroup: create a name group. Argument is the group tocreate.
  • deletegroup: delete a name group and all contents. Argument isthe group to delete.
  • showmeta: Shows system and user meta info. Argument is thegroup or object to show meta info from.
  • setmeta: Set user meta info. Arguments are the object name andthe meta data string.
  • shutdown: send the NS a shutdown request, so that a cleanshutdown is performed. No arguments.
pyro-xnsc这个就是上面那个图像界面版,界面是用到Tk模块写的GUI
pyro-wxnsc,也是GUI,不过是用到WxPython写的GUI
pyro-nssvc,pyro-essvc(win下的name sever以及event server)
Using python -m to start various tools
python -m Pyro.naming - start the name server
python -m Pyro.EventService.Server - start theevent server
python -m Pyro.nsc - start the nsc tool. Alsoworks with xnsc and wxnsc.
python -m Pyro.configuration - print a dump ofPyro's active configuration settings.
python -m Pyro.test.echoserver - start thebuilt-in echo server. Use '-h' parameter to get some help.
Write the remoteclass
不能直接直接访问class的某个属性,不能再用getters,setters
Write theserver
 1,Pyro.core.initServer(),这里有一些可选参数,banner,当banner=1的时候,在标准输出流输出一条信息:
Pyro Server Initialized. Using Pyro V3.16
当然如果你是先创建一个PyroDaemon的话,就不用initServer了,这个在Daemon的时候会自动创建。不过还是初始化来得好。
  2,创建一个Pyro Daemon(后台?驱动?守护进程??不知道要翻译成什么)
daemon=Pyro.core.Daemon()
daemon.useNameServer(ns)#Daemon需要知道你的Name Server
其中,daemon=Pyro.core.Daemon()创建Daemon的时候有一些参数,比如
protocol,这个是你创建用的协议,默认为PYRO
host,如果你的系统有个多个IP地址的话,或者多个适配器。不过我只有一个,这项就不考虑了。
port,默认是PYRO_PORT。一般都不用设置,pyro会自动分配给我们,如果没过端口被占用了,那么pyro会继续试下一个端口。不过这个‘试’也是有限制的,在一个范围内,PYRO_PORT_RANGE。如果你想让pyro随机的话,要设置为0,并且设norange=1或者norange=True,
norange,不解释
publishhost,在分布URI的时候,如果你有设置这个选项,那么就用这个。
比如, daemon=Pyro.core.Daemon(port=0,norange=True,publishhost='123.13.123.11')
The object's uri2 is:PYRO://123.13.123.11:51366/0a0402650e8829e6d9672d7cae85e48e
find the Name Server
ns探测器
locator=Pyro.naming.NameServerLocator()
ns=locator.getNS()
现在,ns就有个引用,否则daemon可能会被垃圾回收机制给处理掉。

Create object instances

除了Pyro.core.ObjBase之外,还有两个高级类可用,

Pyro.core.SynchronizedObjBase
这个能够确保线程安全,采取同步机制。
Pyro.core.CallbackObjBase
回调。
回调,这个是在client端写的,比如服务器有什么更新啦,要通知client就可以用这个回调函数,否则让client轮询的话对服务器的资源消耗很大。
其实这个回调函数写在client端,供server调用。从这个角度看,此时的client可以看成是‘server’,
而server可以看成是‘client’。当然了,回调也可以看出是一个普通的remoteobject,所以可以用Pyro.core.ObjBase,但是,如果程序有异常的话,这个异常不会再server和client两端都跑出。CallbackObjBase就会在两端抛出。
Onewaycalls没看懂,这个部分没看懂
daemon.connect(),还可以是daemon.connectPersistent(),Look under the"Automatic Rebinding" topic in the "Features and guidelines"chapter for more info.
requestLoop(condition, timeout, others, callback),参数都是可选的