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.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 Pryo4

Pyro4.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 Pyro4

ipAddressServer = "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=birth

    def 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+y

futurecall = 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对象

你可能感兴趣的:(Pyro4 概览)