2011-11-16 47 views
1

我有一个在构造函数中使用参数的对象。我想知道如何从Pyro4中提供这个服务。一个例子:Pyro4,为构造函数参数提供对象。怎么样?

import Pyro4 

class MyPyroThing(object): 
    def __init__(self, theNumber): 
     self.Number = theNumber 

Pyro4.Daemon.serveSimple(
    { 
     MyPyroThing(): None 
    }, 
    ns=True, verbose=True) 

失败当然因为构造函数必须有一个参数。

当这个问题解决后,你如何调用这个对象?

theThing = Pyro4.Proxy("PYRONAME:MyPyroThing") 

编辑:

我认为这个问题没有正确写入,看到我的回答如下。

+0

如果问题没有按照您在自己的答案中的说法正确提问,请更新问题以便对其他人有用。 – jcollado

回答

3

上面的答案并不是我真正要问的,这意味着我很不好地解释了我的问题。 Mea Culpa。

我想调用客户端上的实例。但这不是Pyro4的工作原理。在服务器上实例化的类和此实例通过线路传输。

邮寄Irmin(最初的开发人员)后,我清楚地知道Pyro4是如何工作的。

所以,我现在所做的是使用工厂模式,我要求工厂给我一个对象的实例。例如:

psf = Pyro4.Proxy("PYRONAME:MyApp.Factories.ProductFactory") 
product = psf.GetProductOnButton(buttonNoPressed, parentProductId) 

product是Product()类的一个实例。由于实例在Pyro守护进程中注册,我可以在Product()的这个实例上调用方法。看看购物车的例子,知道我在哪里得到了我的灵感。

0

而不是使用Pyro4.Daemon.serveSimple,您可以:

  • 获取使用Pyro4.locateNS
  • 创建一个Pyro4.Daemon对象
  • 创建你需要公开
  • 使用守护register方法,使物体的名称服务器它们可用
  • 使用名称服务器register方法为uri映射提供名称
  • 启动守护环

的代码会或多或少如下:

import Pyro4 

name_server = Pyro4.locateNS() 
daemon = Pyro4.Daemon() 
my_object = MyPyroThing(parameter) 
my_object_uri = daemon.register(my_object) 
name_server.register('MyPyroThing', my_object_uri) 

daemon.requestLoop() 

在此之后,my_object URI将在名称服务器MyPyroThing可用。

+0

我如何从客户端调用它? –

+0

鉴于该对象已在名称服务器中注册,名称为“MyPyroThing”,问题中的代码应该可以工作,即theThing = Pyro4。代理(“PYRONAME:MyPyroThing”)' – jcollado

+0

或者,您可以在名称服务器中查找名称,并为返回的URI创建一个代理(如果您要发送很多消息到该对象并且不会移动到一个不同的机器):'uri = name_server.lookup('MyPyroThing'); theThing = Pyro4.Proxy(uri)' – jcollado

相关问题