http://python.blog.163.com/blog/static/183010453201201145855429/
Pyro是一个用纯python代码实现的分布式对象系统,与早年的CORBA系统有很强的相似性,不过只支持Python的客户端和服务器端,截至目前的版本是4.11版。
网站地址:http://irmen.home.xs4all.nl/pyro/
主要特性如下:
.100% Python 代码编写,超级可移植.
.支持所有的可pickle的Python数据类型.
.可以运行在Python2.x, python3.x, Ironpython,Jython,Pypy之上.
.在不同的硬件架构和不同的操作系统之间能兼容工作(64-bit, 32-bit, Intel, PowerPC...).
.以容易使用和尽量减少你的额外工作为设计目标.
.用名字服务器跟踪你的对象的实际位置,你可以透明转移他们.
.中断后自动重连到服务器端
.自动对Pyro的对象进行代理,意味着你可以像返回本地一般对象那样返回远程对象.
.提供增强性能的单向调用方法.
.对同一个对象调用很多次时,可以使用批量调用方法来极大的提高性能.
.你可以定义网络通讯超时来避免一些错误发生会导致的调用时永久阻塞.
.如果你想延后一段时间获得结果,可以使用异步调用方法. Pyro在后台收集调用结果数据.
.就像本地异常一样抛出远程异常到调用端. 你可以获得详细的远程traceback信息.
.在很多平台可靠地工作的,稳定的,网络通讯代码.
.可以使用Pyro自己的事件循环(event loop), 或者集成到你自己的(或第三方的)事件循环中去.
.提供了很多简单的例子以展示Pyro的特性和技术。
.大量的单元测试并达到了很高的覆盖率.
.10多年的开发历史
.可以使用IPv4和Unix域socket接口(IPv6目前还不支持,正在开发中)
Pyro的基本组成部分是服务端和客户端,Pyro还提供了一个名字服务器以用来查找指定的服务。网站上的例子是最简单的例子,不是很实用(对于服务的端口和url都是通过名字服务器查找而得到的),这里做了一个实用的,无需NameServer的基本例子,供大家参考一下。
最基本的服务器代码如下:
----------------------------------------------------------------------------------------------
#coding:utf-8
import Pyro4
Pyro4.config.HMAC_KEY = '123456' #客户端和服务器端需要相同的 HMAC_KEY, 以保证一定的安全性
#定义服务对象
class GreetingMaker(object):
def get_hello(self, name):
return "Hello, {0} from server.".format(name)
greeting_maker=GreetingMaker()
#产生一个Pyro的daemon对象,指定服务端口
daemon=Pyro4.Daemon(port=7555)
#注册greeting对象
uri=daemon.register(greeting_maker, "greating")
# 打印uri,客户端可以使用这个url调用服务端
print "Object uri =", uri
# 事件循环,等待并处理请求
daemon.requestLoop()
-----------------------------------------------------------------------------------------------
客户端代码:
-----------------------------------------------------------------------------------------------
#coding:utf-8
import Pyro4
Pyro4.config.HMAC_KEY = '123456' #客户端和服务器端需要相同的 HMAC_KEY, 以保证一定的安全性
name=raw_input("What is your name? ").strip()
#服务url格式:PYRO:服务名@主机:端口
greeting_maker=Pyro4.Proxy("PYRO:greating@localhost:7555")
print greeting_maker.get_hello(name)
------------------------------------------------------------------------------------------------
在同一服务器上运行服务器端代码后,再运行客户端代码,一个小小的pyro的例子就能跑起来了。