2016-07-31 7 views
1

Ich bin neu in Tornado.Wie erstelle ich eine nicht blockierende Funktion?

Es ist aufregend über den Teil von Coroutines.

Also versuche ich zuerst eine blockierende Funktion in eine nicht blockierende umzuwandeln.

@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 

Aber ich habe:

1.41436505318 
1.38487792015 
2.80179595947 

Es ist I/O Bindung also denke ich, die gesamte Zeit auf die längere Zeit eine ungefähre Angabe ausgegeben (1,41436505318) ausgegeben sollte. Aber es scheint zu blockieren.

Also ich frage mich, was schief läuft Wie kann ich eine blockierende Funktion in eine nicht blockierende Funktion konvertieren?

Antwort

2

return_future macht keine Funktion nicht blockierend; Es benötigt eine nicht blockierende Funktion, die Callbacks verwendet und es koroutinenfreundlich macht.

Die Blockierungsfunktion kann nur blockiert werden, wenn sie tiefgreifend geändert wird, indem sie in einem anderen Thread oder Prozess ausgeführt wird, wie bei einer ThreadPoolExecutor.

Verwandte Themen