0

我正在尝试p1.get_name()从另一个远程 Pyro 对象调用 Pyro 对象方法p2。该方法应该返回p1对象的名称,但它没有返回任何内容(空字符串)。令人惊讶的是,我看到它p1是可以访问的,p2因为当我调用时p1.print_hello(),它可以工作。似乎传递了一个新实例而不是初始化的实例,我不确定发生了什么。请看下面的代码,谢谢你的帮助!

以下代码创建代理(为了便于阅读,我忽略了名称服务器并创建了守护进程):

def create_proxy(ns_host, thing_host):
    ns = Pyro4.locateNS(host=ns_host)
    uri = ns.lookup(thing_host) 
    return Pyro4.Proxy(uri)

p1 = create_proxy('localhost', 'host1')
p1.init()
p2 = create_proxy('localhost', 'host2')
p2.init(p1)

p1 和 p2 对象的类定义如下所示:

Class Host1:
   def __init__(self)
      self.name = ''

   def init(sut):
      self.name = 'host 1'
   def get_name(self):
      return self.name

Class Host2:
   def init(p):
      print('Host name: ', p.get_name())

干杯,/纳斯

4

1 回答 1

1

没有实际的“实例”通过 Pyro 传递,传递的是远程对象的代理信息(在你的例子中,p1)。

然而,由于默认的服务器并发模型是“会话”,当您最终从另一个 Pyro 对象中调用 get_name() 时,Pyro 确实会创建一个新的 Host1 实例。没有办法以某种方式“共享”相同的连接。

但是,如果您可以将其设为单例(实例模式“单例”),则可以共享同一个对象。请参阅Pyro 文档如何执行此操作。

于 2020-05-11T15:06:05.297 回答