2016-07-31 36 views
1

我是龍捲風新手。如何創建一個非阻塞函數?

令人興奮的是Coroutines的部分。

所以我嘗試首先將阻塞函數轉換爲非阻塞。

@tornado.concurrent.return_future 
def calculate(callback): 
    start_time = time.time() 
    res = urllib2.urlopen("https://www.google.com/") 
    print time.time()-start_time 
    callback(res) 

class MainHandler(tornado.web.RequestHandler): 

    @tornado.gen.coroutine 
    def get(self): 
     start_time = time.time() 
     res = yield [calculate(), calculate()] 
     print time.time()-start_time 

但我得到:

1.41436505318 
1.38487792015 
2.80179595947 

它的I/O瓶頸,所以我想花應該是接近(1.41436505318)花費的時間越長一次的總時間。 但它似乎阻塞。

所以我想知道怎麼回事?如何將阻塞函數轉換爲非阻塞函數?

回答

2

return_future不做功能無阻塞;它需要一個使用回調的非阻塞函數,並且使它更友好。

如果不對其進行深層更改而使其成爲非阻塞功能的唯一方法是在另一個線程或進程中運行它,如ThreadPoolExecutor