2017-10-18 94 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了解平行并发之间的差异。这对我帮助很大。