2013-08-05 48 views
1

我正在玩弄扭曲,我試圖創建一個簡單的主服務器,它向其從服務器分發單元測試列表。以下代碼有效,但我的輸出很奇怪。從機執行最後一次單元測試n次,而不是執行n次測試中的每一次。扭曲的回調鏈錯誤地重複了最後一個回調

我正在使用twisted內建的放大器協議。這裏是相關的代碼:

class Master(object): 

    def __init__(self): 
     self.tests = [ 
      "test1", 
      "tests2", 
      ... etc 
     ] 

    def serve(self): 
     self.factory = MasterFactory() 
     reactor.listenTCP(1234, self.factory) 
     d = threads.deferToThread(self.get_cmd) 
     d.addCallback(lambda ign: self.run_test()) 
     print 'Serving on port 1234' 

    def get_cmd(self): 
     return raw_input('> ') 

    def run_test(self): 
     while True: 
      for slave in self.factory.slaves.values(): 
       if self.tests == []: 
        break 
       slave.tests.append(self.tests.pop(0)) 
      if self.tests == []: 
       break 

     for slave in self.factory.slaves.values(): 
      self.construct_list(slave) 

    def construct_list(self, slave): 
     d = defer.Deferred() 
     for test in slave.tests: 
      d.addCallback(lambda ign: 
       slave.protocol.callRemote(commands.RunCmd, cmd="python setup.py trial -s " + test)) 
      d.addCallback(self.cmd_response) 
     d.callback(None) 

    def cmd_response(self, response): 
     print response['output'] 
     return None 


def main(): 
    m = Master() 
    m.serve() 
    reactor.run() 

if __name__ == "__main__": 
    main() 
+0

另外,'run_test'中的邏輯可以使用'itertools.cycle'來簡化。我會做''測試,奴隸在zip(self.tests,循環(self.factory.slaves.values())):slave.tests.append(測試)',然後'self.tests = [] '。 –

回答

3

這是循環變量和閉包在Python中的工作方式的常見問題。考慮這個例子:

>>> def f(n): 
...  print n 
... 
>>> fs = [] 
>>> for i in range(3): 
...  fs.append(lambda: f(i)) 
... 
>>> fs[0]() 
2 
>>> fs[1]() 
2 
>>> fs[2]() 
2 
>>> 
+0

爲了澄清,問題出現在'construct_list'的循環中。 –