您的位置:首页 > 编程语言 > Python开发

使用 twisted 的 txrestapi 模块提供基本的异步 API 服务。

2016-06-19 17:41 323 查看
twisted 是python的一个异步网络框架,txrestapi 是基于 twisted 的一个 RESTFUL API 服务的包,使用 txrestapi 的代码基本如下:

from twisted.internet import reactor
from twisted.web import server
from txrestapi.resource import APIResource
from txrestapi.methods import GET, POST, PUT, ALL

class MyResource(APIResource):

@GET("/path1")
def path1(self, request):
return "path1"

@POST("/path2")
def path2(self, request):
return "path2"

@ALL("/")
def default(self, request):
return "default route"

if __name__ == "__main__":
site = server.Site(MyResource())
reactor.listenTCP(8080, site)
reactor.run()


当我们把程序运行起来后,可以在浏览器中访问 http://127.0.0.1:8080/path1 得到 path1, 访问其他可以得到 default route.

从代码来看,这个路由请求的回调函数是比较快的执行结束了。但是存在一个问题,如果某一个路由请求需要执行一段时间后才能得到最终的结果,如何才能将正确的数据返回给请求者呢? 这里就需要用到 twisted.web.server.NOT_DONE_YET 这个属性。这样把 NOT_DONE_YET 返回给 reactor 的时候,它不会立即构造 response 返回给请求者,一直会得到 request.finish() 的调用,或者超时!

因此,我们修改代码如下:

class MyResource(APIResource):
def __init__(self):
APIResource.__init__(self)
pass

@GET("/path1")
def path1(self, request):
def make_response(req):
req.write("end path1 request")
req.finish()
d = Deferred()
d.addCallback(make_response)
reactor.callLater(5, d.callback, request)
return server.NOT_DONE_YET

@POST("/path2")
def path2(self, request):
return "path2"

@ALL("/")
def default(self, request):
return "default route"

执行代码,在浏览器访问 http://127.0.0.1:8080/path1, 每次都会延迟 5s, 在这 5s 内,继续请求其他路径,不会被阻塞,立刻得到响应!

如此,当路径请求 path1 处于等待状态的时候,reactor 会继续接收其他的路径请求!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 异步 阻塞