2013-10-31 71 views
2

如何使用我的zerorpc服務器維護不同的會話或本地狀態?例如(如下),如果我有多個客戶端,後續客戶端將覆蓋模型狀態。我想過每個客戶端都有一個ID,RPC邏輯會試圖以這種方式分離變量,但是tbis似乎很混亂,一旦客戶端斷開連接,我將如何清除舊狀態/變量?與zerorpc保持會話

服務器

import zerorpc 
import FileLoader 

class MyRPC(object): 
    def load(self, myFile): 
     self.model = FileLoader.load(myFile) 
    def getModelName(self): 
     return self.model.name 

s = zerorpc.Server(MyRPC()) 
s.bind("tcp://0.0.0.0:4242") 
s.run() 

客戶端1

import zerorpc 

c = zerorpc.Client() 
c.connect("tcp://127.0.0.1:4242") 
c.load("file1") 
print c.getModelName() 

客戶端2

import zerorpc 

c = zerorpc.Client() 
c.connect("tcp://127.0.0.1:4242") 
c.load("file2") # AAAHH! The previously loaded model gets overwritten here! 
print c.getModelName() 
+0

我真的希望這個問題得到了妥善的回答。似乎沒有簡單的方法來訪問底層的zeromq會話,這可能有助於維護每個會話的附加狀態。也許好的會話令牌將不得不完成這項工作。 –

回答

-1

有關會話不知道......但如果你w ^螞蟻找回不同的模型?也許你可能只有一個實例化新Model()的函數?

import zerorpc 
import FileLoader 

models_dict ={} # Keep track of our models 

def get_model(file): 
    if file in models_dict: 
     return models_dict[file] 
    models_dict[file] = MyModel(file) 
    return model 

class MyModel(object): 

    def __init__(self, file): 
     if file: 
      self.load(file) 

    def load(self, myFile): 
     self.model = FileLoader.load(myFile) 

    def getModelName(self): 
     return self.model.name 

s = zerorpc.Server(<mypackagename.mymodulename>) # Supply the name of current package/module 
s.bind("tcp://0.0.0.0:4242") 
s.run() 

客戶:

import zerorpc 

c = zerorpc.Client() 
c.connect("tcp://127.0.0.1:4242") 
print c.get_model("file1")