使用
time.sleep()可以防止扭曲工作。要使其无法使用
time.sleep(),必须改为将控制权恢复为Twisted。修改现有代码以执行此操作的最简单方法是使用
twisted.internet.defer.inlineCallbacks,这是自切片面包以来的第二好方法:
#!/usr/bin/env pythonimport timefrom twisted.web import httpfrom twisted.internet import protocolfrom twisted.internet import reactorfrom twisted.internet import deferdef wait(seconds, result=None): """Returns a deferred that will be fired later""" d = defer.Deferred() reactor.callLater(seconds, d.callback, result) return dclass StreamHandler(http.Request): BOUNDARY = 'BOUNDARY' def writeBoundary(self): self.write("--%sn" % (self.BOUNDARY)) def writeStop(self): self.write("--%s--n" % (self.BOUNDARY)) @defer.inlineCallbacks def process(self): self.setHeader('Connection', 'Keep-Alive') self.setHeader('Content-Type', "multipart/x-mixed-replace;boundary=%s" % (self.BOUNDARY)) self.writeBoundary() self.write("Content-Type: text/htmln") s = "<html>foo</html>n" self.write("Content-Length: %snn" % (len(s))) self.write(s) self.writeBoundary() yield wait(2) self.write("Content-Type: text/htmln") s = "<html>bar</html>n" self.write("Content-Length: %snn" % (len(s))) self.write(s) self.writeBoundary() yield wait(2) self.write("Content-Type: text/htmln") s = "<html>baz</html>n" self.write("Content-Length: %snn" % (len(s))) self.write(s) self.writeStop() self.finish()class StreamProtocol(http.HTTPChannel): requestFactory = StreamHandlerclass StreamFactory(http.HTTPFactory): protocol = StreamProtocolif __name__ == '__main__': reactor.listenTCP(8800, StreamFactory()) reactor.run()在Firefox中有效,我想它可以正确回答您的问题。



