Twisted异步请求处理

时间:2011-11-16 07:22:49

标签: python twisted twisted.web twisted.internet

如何在Node.js中以Twisted方式执行异步请求处理?

我用Twisted编写了示例,但是我的应用程序仍在等待长时间操作的回答(我用time.sleep模拟了这个。)

另外我不明白我怎么能正确使用reactor.callLater。

这是我的扭曲应用示例。


from twisted.web import server
from twisted.web.resource import Resource
from twisted.internet import reactor
from twisted.internet.defer import Deferred
import time

class Hello(Resource):
    def getChild(self, name, request):
        if name == '':
            return self
        print name
        return Resource.getChild(self, name, request)

    def render_GET(self, req):
        d = Deferred()
        reactor.callLater(2, d.callback, None)
        d.addCallback(lambda _: self.say_hi(req))
        return server.NOT_DONE_YET

    def say_hi(self, req):
        req.setHeader("content-type", "text/html")
        time.sleep(5)
        req.write("hello!")
        req.finish()

class Hello2(Resource):
    isLeaf = True
    def render_GET(self, req):
        req.setHeader("content-type", "text/html")
        return "hello2!"

root = Hello()
root.putChild("2", Hello2())
reactor.listenTCP(8080, server.Site(root))
reactor.run()

编辑:现在问题是如何编写同步代码?请举例。

1 个答案:

答案 0 :(得分:4)

你已经在做了......等等。

您的问题是time.sleep()是阻止通话,因此会使您的整个服务器停止。

如果你使用它作为网络I / O(例如urllib)的替代品,最好的选择通常是使用Twisted进行I / O(如twisted.web.client.getPage而不是尝试对阻止代码做一些事情。 Twisted有很多客户端库。这些库通常会为您提供Deferred,您已经在处理它。

如果您将其用作实际等待的替身,则可以创建一个等待deferLaterDeferred

如果您将其用作CPU密集型的替代品,而不是抓取GIL(如PIL图像编码或原生XML解析器),或现有的本机/专有I / O层(如您不希望重写以使用Twisted的Oracle或MSSQL数据库绑定),您可以使用deferToThread调用它。

但是你得到了Deferred,你几乎可以设置来处理它。您只需要调整say_hi即可返回一个:

def say_hi(self, req):
    req.setHeader("content-type", "text/html")
    d = getADeferredSomehow()
    def done(result):
        req.write("hello!")
        req.finish()
    return d.addBoth(done)