我在扭曲的服务器中使用扭曲循环呼叫在特定时间间隔后呼叫一次。我的代码如下:
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秒后调用一次,而不管是否。连接服务器的客户端。
答案 0 :(得分:0)
每个连接有一个Protocol
个实例。每个实例都在建立连接时调用其connectionMade
方法。
此方法:
def connectionMade(self):
self.factory.clients.append(self)
self.setRawMode()
startClock(self)
每个连接调用一次,因此每个连接调用一次startClock
。
与此相反的是您的main
功能。它只被调用一次。如果您在startClock
中发出main
来电并将其从connectionMade
中删除,那么startClock
只会被调用一次。它将在程序启动时调用,然后再进行任何连接,并且永远不会再次调用。
请注意,代码已在工厂实例上维护Protocol
个实例的列表。这意味着,在给出工厂参考后,您可以访问所有Protocol
个实例。这意味着如果您将工厂作为参数传递给正在循环的函数...