RestKit(Python包)可以以非阻塞方式与Tornado一起使用吗?

时间:2013-12-19 17:37:41

标签: python asynchronous tornado

我们正在使用Tornado开发面向资源的架构,并且不希望不得不推出自己的REST使用者。

RestKit(Python包,而不是iOS库)看起来是一个非常好的选择,但目前尚不清楚它的I / O是否阻塞。它确实有内置的Gevent支持,但我的理解是Tornado与Gevent不能很好地配合,所以这不是一个真正的解决方案。

有没有办法让这样的东西适应龙卷风?如果是这样,怎么会这样做呢?

2 个答案:

答案 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包似乎可以修补任何依赖于请求的模块以非阻塞方式执行请求。