如何创建非阻塞功能?

时间:2016-07-31 16:27:29

标签: python tornado

我是龙卷风的新手。

令人兴奋的是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)。 但它似乎阻止了。

所以我想知道出了什么问题?如何将阻塞功能转换为非阻塞功能?

1 个答案:

答案 0 :(得分:2)

return_future不会使功能无阻塞;它需要一个使用回调的非阻塞函数,并使其对于协程友好。

阻止函数非阻塞而不对其进行深度更改的唯一方法是在另一个线程或进程中运行它,就像使用ThreadPoolExecutor一样。