我们正在使用Tornado开发面向资源的架构,并且不希望不得不推出自己的REST使用者。
RestKit(Python包,而不是iOS库)看起来是一个非常好的选择,但目前尚不清楚它的I / O是否阻塞。它确实有内置的Gevent支持,但我的理解是Tornado与Gevent不能很好地配合,所以这不是一个真正的解决方案。
有没有办法让这样的东西适应龙卷风?如果是这样,怎么会这样做呢?
答案 0 :(得分:0)
好吧,如果它使用return,它会阻塞。所以这个:
r = request("http://google.com")
阻止Tornado IOLoop。
我认为你不能在龙卷风中使用gevent。有可能使用eventlet,但是如果你真的想使用阻塞库,我认为线程池更简单。
from futures import ThreadPoolExecutor
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine
from tornado.concurrent import run_on_executor
from restkit import request
class MainHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(6)
@run_on_executor
def async_request(self, *args, **kwds):
return request(*args, **kwds)
@coroutine
def get(self):
urls = ["http://yahoo.fr",
"http://google.com",
"http://friendpaste.com",
"http://benoitc.io",
"http://couchdb.apache.org"]
for url in urls:
resp = yield self.async_request(url, follow_redirect=True)
self.write("RESULT: %s: %s (%s)\n" % (url, resp.status, len(resp.body_string())))
self.finish()
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
这使用futures(已经向后移植)和tornado.gen。
我发现只是构建HTTPRequest对象并使用Tornado httpclient更简单。线程(或gevent,或其他)为您的应用程序增加了额外的复杂性。
答案 1 :(得分:0)
看起来这可能是一个解决方案:这个trequests包似乎可以修补任何依赖于请求的模块以非阻塞方式执行请求。