Pyro4|Pyro4 概览

一、使用Pyro的几个关键概念: Pryo4的主要模块API文档: https://pythonhosted.org/Pyro4/api/main.html#module-Pyro4
1.Pyro object Pyro对象,是一个普通的python对象。

装饰器 类型 说明
@Pyro4.expose 使用方法 创建Pyro类并公开其方法和属性
1-1.创建Pyro对象
@Pyro4.expose
import Pyro4@Pyro4.expose class MyPyroThing(object): # ... methods that can be called go here... pass'''1创建守护进程''' daemon = Pyro4.Daemon()'''2注册uri''' uri = daemon.register(MyPyroThing) print(uri)'''3.启动守护进程''' daemon.requestLoop()

一旦客户端连接,Pyro将创建类的一个实例,并在一个客户端代理会话期间使用该单个对象来处理远程方法调用。一旦客户端断开连接,对象就会被移除。另一个客户端连接为其会话创建另一个实例。
1-2.详细控制实例模式和实例创建
@Pyro4.behavior ( instance_mode = "session" )
有三种可能的选择instance_mode参数:
参数 说明
session(默认值) 为每个新的代理连接创建一个新实例。
single 只创建一个实例,所有的代理连接只使用这个实例。
percall 为每个方法调用创建一个新实例,然后丢弃。
import Pyro4@Pyro4.behavior(instance_mode="percall") class MyPyroThing(object): @Pyro4.expose def method(self): return "something"daemon = Pyro4.Daemon() uri = daemon.register(MyPyroThing) print(uri) daemon.requestLoop()

1-3.创建有参数的类的实例
@Pyro4.behavior ( instance_creator = "xxxx" )
instance_creator
2.Pyro daemon (server) 守护进程 Pyro守护进程,就是服务器啦
pyro类 路径 说明
Pyro4.Daemon Pyro4.core.Daemon 守护进程
创建守护进程
Pyro4.Daemon (
host=None,
port=0,
unixsocket=None,
nathost=None,
natport=None,
interface=
)

返回 说明
Pyro4.Daemon实例 守护进程的实例对象(本地)
服务端: import Pyro4'''创建守护进程''' daemon = Pyro4.Daemon(host=localhost,port=9090)# make a Pyro daemon uri = daemon.register(MyPyroThing)#注册Pyro对象 print(uri) daemon.requestLoop()---------------------------------------------------------------------------------------------------------------------- 客户端: import Pyro4'''代理连接守护进程''' daemon=Pyro4.Proxy("PYRO:"+Pyro4.constants.DAEMON_NAME+"@localhost:9090")

守护进程(类方法)Server: https://pythonhosted.org/Pyro4/api/core.html#Pyro4.core.Daemon
方法 说明
annotations()
clientDisconnect (conn)
close () 关闭服务器并释放资源
combine (daemon) 组合守护进程 在当前守护进程的循环中组合其他守护进程的事件循环。
events (eventsockets) 事件 用于外部事件循环:处理对此守护进程挂起的所有请求。
handleRequest (conn) 处理Pyro请求。
housekeeper_lock
housekeeping
locationStr
natLocationStr
objectsById
proxyFor
register (obj_or_class, objectId=None, force=False) 注册需要远程代理访问的类
requestLoop () 启动守护进程,用于循环处理传入的请求
resetMetadataCache
selector
serveSimple 简单守护进程创建
shutdown () 终止守护进程并清理
sock 属性 返回守护进程使用的服务器套接字。
sockets 属性 返回所有的套接字 (同上)
streaming_responses
transportServer
unregister (objectOrId) 注销远程代理访问的类对象
uriFor (objectOrId, nat=True) 通过对象ID 获取代理访问对象的uri
validateHandshake 验证客户端连接
守护进程(实例对象方法)Client:
方法 说明
get_metadata (objectId, as_lists=False) 获取代理对象公开的方法,属性等
info () 返回有关守护进程的一些描述性信息。
ping() 测试连接
registered() 返回守护进程中,已经注册的代理对象,list
3.Proxy代理 (Client) 【Pyro4|Pyro4 概览】客户端用于远程操控
路径 说明
Pyro4.Proxy Pyro4.core.Proxy 连接远程的守护进程
Pyro4.Proxy ( URI )
1.若使用远程 ‘守护进程’ 的URI连接,则用于操控远程的守护进程。
2.若使用远程‘对象’的URI连接,则用于操控远程的对象。
参数 说明
远程守护进程的URI "PYRO:Pyro.Daemon@host:xxxx"
远程对象的URI "PYRO:ikale@host:xxxx"
返回 说明
Pyro4.Daemon实例 远程守护进程的实例对象
操控远程守护进程的类方法: https://pythonhosted.org/Pyro4/api/core.html#Pyro4.core.Proxy
方法 说明
_pyroBind () 将此代理绑定到uri中的确切对象
_pyroRelease () 释放pyro守护进程的连接。
_pyroBatch ()
_pyroReconnect (tries=100000000) 释放连接并重新尝试建立新连接,直到成功或尝试次数用完。
_pyroAsync (async=True)
_pyroAnnotations ()
_pyroResponseAnnotations (annotations, msgtype)
_pyroValidateHandshake (response)
_pyroTimeout 属性
_pyroSerializer 属性
_pyroHmacKey 属性
_pyroMaxRetries 属性
_pyroHandshake 属性
4.URI 链接
symbol 类型 说明
Pyro4.URI Pyro4.core.URI
这就是Pyro用来识别每个对象的方法,类似于网页URL指向Web上不同文档的内容。
uri = daemon.register(GreetingMaker) ns.register("example.greeting",uri)# register the object with a name in the name server

3.Pyro name server 命名服务器 命名服务器是为Pyro应用程序提供类似电话簿的实用工具。
ns = Pyro4.locateNS()# find the name server

6.Serialization序列化 这是将对象转换为可以通过网络传输的字节流的过程,接收方将它们反序列化为实际对象。
7.Configuration 配置 可以通过多种方式配置pyro。
1.使用环境变量设置配置项;
2.在代码中设置配置项;
默认配置在大多数情况下应该是可以的,所以您根本不必碰这些选项中的任何一个!
7-1.查看配置
1.在cmd命令行工具查看: pyro4-check-config
2.在代码中查看单个配置项:print(Pyro4.config.COMPRESSION)
3.以字典的形式查看配置:Pyro4.config.asDict()
4.以字符串的形式查看:Pyro4.config.dump()
配置项的详细参数说明
7-2.将配置重置为默认值
Pyro4.config.reset([useEnvironment=True])
useEnvironment设置为True,将整个Pyro库的环境都重置。
useEnvironment设置为False,只在当前环境中重置。
7-3.更改配置
在代码头部使用:
Pyro4.config.xxxx = xxx
配置项的详细参数说明
import Pryo4Pyro4.config.COMPRESSION = True Pyro4.config.SERVERTYPE = "multiplex" ......code····

二、简单使用
Pyro4.Daemon.serveSimple (
objects [host=None, port=0, daemon=None, ns=True, verbose=True]
)
参数 类型 说明
objects dict 将对象/类映射为名称
host str 指定IP地址
port int 指定端口号
daemon Pyro4.core.Daemon 指定自己创建的守护进程。 如果不指定,则该方法将自行创建一个新的守护进程对象。
ns bool True(默认值)。是否使用命名服务
verbose bool True(默认值)。是否打印一些已注册对象的信息。
返回 类型 说明
服务端
# saved as greeting-server.py import Pyro4@Pyro4.expose class GreetingMaker(object): def get_fortune(self, name): return "Hello, {0}. Here is your fortune message:\n" \ "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)Pyro4.Daemon.serveSimple( { GreetingMaker: 'Greeting',#需要代理的类 }, host="0.0.0.0",#IP地址 port=9090,# 端口号 ns=False,#命名服务 verbose=True# )

客户端
# saved as greeting-client.py import Pyro4ipAddressServer = "localhost" # TODO add your server remote IP here# Works for Python3, see edit above for notes on Python 2.x name = input("What is your name? ").strip()greetingMaker = Pyro4.core.Proxy('PYRO:Greeting@' + ipAddressServer + ':9090') print(greetingMaker.get_fortune(name))# call method normally

另一种通用使用
服务器代码
# saved as student-server.py import Pyro4@Pyro4.expose class Student(object): def __init__(self,birth): self._birth=birthdef age(self): return 2019 - self._birth """1.创建守护进程""" daemon = Pyro4.Daemon()# make a Pyro daemon"""2.创建命名服务""" ns = Pyro4.locateNS()# find the name server"""3.将类注册为Pyro对象""" uri = daemon.register(Student)# register the greeting maker as a Pyro object"""4.命名Pyro对象""" ns.register("example.Student",uri)# register the object with a name in the name server """5.启动服务器""" daemon.requestLoop()# start the event loop of the server to wait for calls

三、异步调用 https://pythonhosted.org/Pyro4/api/futures.html#Pyro4.futures.Future.then
异步代理只有在处理Pyro代理时才可用
1.创建Future对象
Pyro4.Future( someting )
def add(x,y): return x+yfuturecall = Pyro4.Future(add) result = futurecall(4,5) # do some other stuff... then access the value summation = result.value

2.访问 https://pythonhosted.org/Pyro4/clientcode.html#async-calls
.value
返回值。异步程序返回的处理结果。可以配合ready一起使用
.ready
状态。True为有返回值,False为还没有返回值。
.wait(timeout=None)
设置超时(以秒为单位)。默认值为None,意味着无限等待。
已超时返回:False,未超时返回:True
.then(callable[, *args, **kwargs])
添加调用链。
当前调用的结果将用作下一个调用的第一个参数。可选的*args 和 **kwargs参数
.iferror(errorhandler)
错误处理。
指定要调用的异常处理程序(仅将异常对象作为参数)
3.回调 使用回调,需要在Pyro守护进程中注册回调Pyro对象

    推荐阅读