只运行一次扭曲的循环调用

时间:2014-02-06 11:29:20

标签: python-2.7 twisted

我在扭曲的服务器中使用扭曲循环呼叫在特定时间间隔后呼叫一次。我的代码如下:

class Echo(LineReceiver):

    def connectionMade(self):
        self.factory.clients.append(self)
        self.setRawMode()
        startClock(self)
        print 'Connected Client', self._peer

    def connectionLost(self, reason):
        self.factory.clients.remove(self)
        print 'Lost connection from', self._peer

    def rawDataReceived(self, data):
        inputArray = ["%02X"%ord(inp) for inp in data]
        if(CheckPacket(inputArray)):
            PacketParser(inputArray, self)
        else:
            print "Fail"
            d = self.transport.getHost ()
            print d.type

def startClock(self):
    l = task.LoopingCall(partial(sendTimeRequest,self))
    l.start(660.0)

def main():
    port = 8000
    factory = protocol.ServerFactory()
    factory.protocol = Echo
    factory.clients = []
    try:
        reactor.listenTCP(port,factory)
    except Exception, ex:
        print "Port %d is busy: %s" % (port, ex)
    reactor.run()

因此我的问题是,每次新客户端连接到服务器时,都会启动新的循环调用。我怎样才能确保它们只有一个循环调用正在运行,即使它们是多个连接到服务器的客户端?目前它正在以下列方式发生,当第一个客户端连接到服务器时,一个扭曲的循环调用开始,每隔10秒调用let函数a()。然后在2秒后另一个客户端连接到服务器然后另一个循环调用开始每隔10秒调用一次函数a()但最后它变成这样

  

经过时间|函数叫

     

10秒|一个()

     

12秒|一个()

     

20秒|一个()

     

22秒|一个()

但是我希望函数a()只在每10秒后调用一次,而不管是否。连接服务器的客户端。

1 个答案:

答案 0 :(得分:0)

每个连接有一个Protocol个实例。每个实例都在建立连接时调用其connectionMade方法。

此方法:

def connectionMade(self):
    self.factory.clients.append(self)
    self.setRawMode()
    startClock(self)
每个连接调用一次

,因此每个连接调用一次startClock

与此相反的是您的main功能。它只被调用一次。如果您在startClock中发出main来电并将其从connectionMade中删除,那么startClock只会被调用一次。它将在程序启动时调用,然后再进行任何连接,并且永远不会再次调用。

请注意,代码已在工厂实例上维护Protocol个实例的列表。这意味着,在给出工厂参考后,您可以访问所有Protocol个实例。这意味着如果您将工厂作为参数传递给正在循环的函数...