如何在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()
编辑:现在问题是如何编写同步代码?请举例。
答案 0 :(得分:4)
你已经在做了......等等。
您的问题是time.sleep()
是阻止通话,因此会使您的整个服务器停止。
如果你使用它作为网络I / O(例如urllib
)的替代品,最好的选择通常是使用Twisted进行I / O(如twisted.web.client.getPage
而不是尝试对阻止代码做一些事情。 Twisted有很多客户端库。这些库通常会为您提供Deferred
,您已经在处理它。
如果您将其用作实际等待的替身,则可以创建一个等待deferLater
的Deferred
。
如果您将其用作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)