2011-11-16 72 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

相關問題