2014-02-07 44 views
0

爲什麼傳入的請求沒有被處理,而另一個請求處於「等待」狀態?爲什麼龍捲風中的異步函數被阻塞?

如果你看看下面的代碼,函數「get」有一個龍捲風任務,用「yield」關鍵字執行,這意味着「等待回調被執行」。在我的代碼中,回調永遠不會執行。如果您第一次處於保持狀態時第二次運行請求,則不處理第二個請求。如果你運行任何其他請求,它們正在處理得很好。

所以,我的行動: 1.啓動應用 2.獲取本地主機:8080/ - 應用程序是打印輸出的 「來電」 3.獲取本地主機:8080/anotherrequest - 應用在打印輸出「另一個請求「 4. GET localhost:8080/ - 應用程序在打印」來電「時未打印任何輸出。爲什麼?

那麼,爲什麼這段代碼被阻塞?代碼示例已附加。

我正在使用龍捲風2.1和Python 2.7來運行此示例。

謝謝

import tornado 
import tornado.web 
from tornado import gen 

class AnotherHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     print 'another request' 
     self.finish() 

class MainHandler(tornado.web.RequestHandler): 
    def printStuff(*args, **kwargs): 
     print 'incoming call' 

    @tornado.web.asynchronous 
    @tornado.gen.engine 
    def get(self): 
     result = yield tornado.gen.Task(self.printStuff); 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
    (r"/anotherrequest", AnotherHandler) 
]) 

if __name__ == "__main__": 
    application.listen(8080) 
    tornado.ioloop.IOLoop.instance().start() 

回答

0

發現了問題,它實際上從瀏覽器發出請求時發生。隨着「捲曲」,一切都按預期工作。對造成的不便表示歉意。

2

每個新的請求爲「localhost:8080 /」「來電」會,事實上,導致應用程序打印但是,對「localhost:8080 /」的請求永遠不會完成。爲了使用yield語句,printStuff必須接受回調並執行它。此外,異步get函數必須調用self.finish

class MainHandler(tornado.web.RequestHandler): 
    def printStuff(self, callback): 
     print 'incoming call' 
     callback() 

    @tornado.web.asynchronous 
    @tornado.gen.engine 
    def get(self): 
     result = yield tornado.gen.Task(self.printStuff) 
     self.finish() 

它更容易使用龍捲風的現代「協同程序」的界面,而不是gen.Task和gen.engine:

class MainHandler(tornado.web.RequestHandler): 
    @gen.coroutine 
    def printStuff(self): 
     print 'incoming call' 

    @gen.coroutine 
    def get(self): 
     result = yield self.printStuff() 
     self.finish() 
+0

我在提及它的目的是永遠不會完成請求。 – user1671010