一、使用Pyro的几个关键概念:
Pryo4的主要模块API文档: https://pythonhosted.org/Pyro4/api/main.html#module-Pyro4
1.Pyro object
Pyro对象,是一个普通的python对象。
装饰器 | 类型 | 说明 |
---|---|---|
@Pyro4.expose | 使用方法 |
创建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 | 验证客户端连接 |
方法 | 说明 |
---|---|
get_metadata (objectId, as_lists=False) | 获取代理对象公开的方法,属性等 |
info () | 返回有关守护进程的一些描述性信息。 |
ping() | 测试连接 |
registered() | 返回守护进程中,已经注册的代理对象,list |
类 | 路径 | 说明 |
---|---|---|
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实例 | 远程守护进程的实例对象 |
方法 | 说明 |
---|---|
_pyroBind () | 将此代理绑定到uri中的确切对象 |
_pyroRelease () | 释放pyro守护进程的连接。 |
_pyroBatch () | |
_pyroReconnect (tries=100000000) | 释放连接并重新尝试建立新连接,直到成功或尝试次数用完。 |
_pyroAsync (async=True) | |
_pyroAnnotations () | |
_pyroResponseAnnotations (annotations, msgtype) | |
_pyroValidateHandshake (response) | |
_pyroTimeout 属性 | |
_pyroSerializer 属性 | |
_pyroHmacKey 属性 | |
_pyroMaxRetries 属性 | |
_pyroHandshake 属性 |
symbol | 类型 | 说明 |
---|---|---|
Pyro4.URI | Pyro4.core.URI |
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-config7-2.将配置重置为默认值
2.在代码中查看单个配置项:print(Pyro4.config.COMPRESSION)
3.以字典的形式查看配置:Pyro4.config.asDict()
4.以字符串的形式查看:Pyro4.config.dump()
配置项的详细参数说明
Pyro4.config.reset([useEnvironment=True])7-3.更改配置
useEnvironment设置为True,将整个Pyro库的环境都重置。
useEnvironment设置为False,只在当前环境中重置。
在代码头部使用:
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参数
3.回调 使用回调,需要在Pyro守护进程中注册回调Pyro对象.iferror(errorhandler)
错误处理。
指定要调用的异常处理程序(仅将异常对象作为参数)