扭曲的self-transport.write在循环内工作



我有下面的客户端代码,它每8秒向服务器发送一些数据,下面是我的代码

class EchoClient(LineReceiver):
    def connectionMade(self):
        makeByteList()
        self.transport.write(binascii.unhexlify("7777"))
        while 1:
            print "hello"
            lep = random.randint(0,4)
            print lep
            print binascii.unhexlify(sendHexBytes(lep))
            try:
                self.transport.write("Hello")
                self.transport.write(binascii.unhexlify(sendHexBytes(lep)))
            except Exception, ex1:
                print "Failed to send"
            time.sleep(8)
    def lineReceived(self, line):
        pass
    def dataReceived(self, data):
        print "receive:", data

while循环中的每个语句都执行,self.transport.write除外。服务器没有接收到任何数据。当循环不执行时,self.transport.write也在外部。在这两种情况下都不会引发异常,但如果我删除while循环,则循环外的语句将正确执行。为什么会发生这种情况?请纠正我的错误?

twisted中的所有方法都是异步。像connectionMadelineReceived这样的所有方法都发生在同一个线程上。Twisted reactor运行一个循环(称为事件循环),当这些事件发生时,它会调用connectionMadelineReceived等方法。

connectionMade中有一个无限循环。一旦Python进入这个循环,它就永远无法退出。Twisted在建立连接时调用connectionMade,您的代码将永远留在那里。Twisted没有机会真正将数据写入传输或接收数据,它被困在connectionMade中!

当您编写Twisted代码时,您必须理解的重要一点是,您可能不会在Twisted线程上阻塞。例如,假设我想在客户端连接后4秒发送一个"你好"。我可以这样写:

class EchoClient(LineReceiver):
    def connectionMade(self):
        time.sleep(4)
        self.transport.write("Hello")

但这是错误的。如果两个客户端同时连接,会发生什么情况?第一个客户端将进入connectionMade,我的程序将挂起4秒,直到发送"Hello"。

扭曲的方法是这样的:

class EchoClient(LineReceiver):
    def connectionMade(self):
        reactor.callLater(4, self.sendHello)
    def sendHello(self):
        self.transport.write("Hello")

现在,当Twisted进入connectionMade时,它会调用reactor.callLater在未来4秒安排事件。然后它退出connectionMade,继续做它需要做的所有其他事情。在你掌握异步编程的概念之前,你不能在Twisted中继续。我建议你仔细阅读这里的Twisted文档。

最后,一个无关的注意事项:如果你有一个LineReceiver,你不应该实现你自己的dataReceived,它会使lineReceived不被调用。CCD_ 15是一个实现自己的CCD_ 16的协议,CCD_。

最新更新