龙卷风超时块
问题描述:
我创建了一个简单的测试应用程序的所有服务检查超时在龙卷风 进口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
答
这些
编辑
更新代码是异步编程的基础知识。要指引您朝着正确的方向看看reactor pattern,特别是在事件循环中。
反应堆模式是事件驱动的体系结构的一种实现技术。简而言之,它使用单线程事件循环阻塞资源发射事件,并将它们分派到 相应的处理程序和回调。
两个函数LoopHandler
和MainHandler
在同一事件循环处理,因此MainHandler
被排队,但从未执行,因为事件循环忙于执行LoopHandler
。
异步编程面临的挑战之一(至少对我来说)是小心阻止诸如数据库操作的调用,例如SQLAlchemy
,文件操作,昂贵的计算等。有一些有趣的方法使用线程池来解决这但你不会需要他们让你开始。
啊,而且万一你绊倒维基文章中,我已经联系的第一句看看here了解平行和并发之间的差异。这对我帮助很大。
那么,你可以正确地调用'LoopHandler' 4次:)然后你的服务器再次被阻塞。 –
@YannicHamann谢谢你,我仍然尝试创造更好的解决方案 – oriaj