2013-12-19 23 views
0

我們正在研究使用Tornado的面向資源的體系結構,並且不想推出我們自己的REST消費者。RestKit(Python包)可以以非阻塞方式與Tornado一起使用嗎?

RestKit(Python的包,而不是iOS的庫)看起來像一個真正偉大的選擇,但目前還不清楚它的I/O是否阻塞。它具有內置的Gevent支持,但我的理解是,Tornado與Gevent並不能很好地配合,所以這不是一個真正的解決方案。

有沒有辦法讓這樣的事情適應Tornado?如果是這樣,一個人會怎麼做呢?

回答

0

那麼,如果它使用返回,它會阻止。所以這個:

r = request("http://google.com") 

阻止龍捲風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對象,並使用旋風httpclient,雖然。線程(或gevent,或其他)給您的應用程序增加了額外的複雜性。

+0

呀,龍捲風AsyncHTTPClient是真棒,但很多提供一噸的附加功能超出了簡單的HTTP請求程序庫取決於請求庫,這些天。 – spoon

0

看起來像這可能是一個解決方案:這個trequests包看起來像它可以猴子修補任何依賴於請求的模塊以非阻塞方式執行請求。