2017-10-18 108 views
0

我創建了一個簡單的測試應用程序的所有服務檢查超時在龍捲風 進口tornado.ioloop 進口tornado.web龍捲風超時塊

class LoopHandler(tornado.web.RequestHandler): 
    def get(self): 
     while (True): 
      print ("in loop") 
     self.write("Loop, Handler") 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

def make_app(): 
    return tornado.web.Application([ 
     (r"/", MainHandler), 
     (r"/loop", LoopHandler), 
    ]) 

if __name__ == "__main__": 
    app = make_app() 
    app.listen(8888) 
    tornado.ioloop.IOLoop.current().start() 

然後我打電話http://localhost:8888/loop端點從來沒有響應,因爲無限循環的問題那http://localhost:8888/也沒有反應。問題是爲什麼發生這種情況,如何解決這個問題?該解決problemn

import tornado.ioloop 
import tornado.web 


@unblock 
class LoopHandler(tornado.web.RequestHandler): 
    def get(self): 
     while (True): 
      print ("in loop") 
     return "Loop, Handler" 

@unblock   
class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     return "Hello, world" 

def make_app(): 
    return tornado.web.Application([ 
     (r"/", MainHandler), 
     (r"/loop", LoopHandler), 
    ]) 

if __name__ == "__main__": 
    app = make_app() 
    app.listen(8888) 
    tornado.ioloop.IOLoop.current().start() 

#unblock.py 
import tornado.web 
import tornado.ioloop 

from concurrent.futures import ThreadPoolExecutor 
from functools import partial, wraps 

EXECUTOR = ThreadPoolExecutor(max_workers=4) 


def unblock(f): 

    @tornado.web.asynchronous 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     self = args[0] 

     def callback(future): 
      self.write(future.result()) 
      self.finish() 

     EXECUTOR.submit(
      partial(f, *args, **kwargs) 
     ).add_done_callback(
      lambda future: tornado.ioloop.IOLoop.instance().add_callback(
       partial(callback, future))) 

    return wrapper 
+0

那麼,你可以正確地調用'LoopHandler' 4次:)然後你的服務器再次被阻塞。 –

+0

@YannicHamann謝謝你,我仍然嘗試創造更好的解決方案 – oriaj

回答

0

這些

編輯

更新代碼是異步編程的基礎知識。要指引您朝着正確的方向看看reactor pattern,特別是在事件循環中。

反應堆模式是事件驅動的體系結構的一種實現技術。簡而言之,它使用單線程事件循環阻塞資源發射事件,並將它們分派到 相應的處理程序和回調。

兩個函數LoopHandlerMainHandler在同一事件循環處理,因此MainHandler被排隊,但從未執行,因爲事件循環忙於執行LoopHandler

異步編程面臨的挑戰之一(至少對我來說)是小心阻止諸如數據庫操作的調用,例如SQLAlchemy,文件操作,昂貴的計算等。有一些有趣的方法使用線程池來解決這但你不會需要他們讓你開始。

啊,而且萬一你絆倒維基文章中,我已經聯繫的第一句看看here瞭解平行併發之間的差異。這對我幫助很大。