2016-07-31 3 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.

Смежные вопросы