当前位置: 首页 > 面试题库 >

如何停止Tornado Web服务器?

袁谭三
2023-03-14
问题内容

我一直在使用Tornado
Web服务器进行一些测试,
并且到了要停止Web服务器的地步(例如在单元测试期间)。龙卷风网页上存在以下简单示例:

import tornado.ioloop
import tornado.web

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

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

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

一旦tornado.ioloop.IOLoop.instance().start()被调用,它将阻塞程序(或当前线程)。读取所述源代码的IOLoop对象给出了文档在这个例子中stop功能:

To use asynchronous methods from otherwise-synchronous code (such as
unit tests), you can start and stop the event loop like this:
  ioloop = IOLoop()
  async_method(ioloop=ioloop, callback=ioloop.stop)
  ioloop.start()
ioloop.start() will return after async_method has run its callback,
whether that callback was invoked before or after ioloop.start.

但是,我不知道如何将其集成到我的程序中。其实我有一个封装(有它自己的Web服务器类startstop函数),但只要我打电话开始,程序(或测试)过程块会反正。

我试图在另一个过程中(使用该multiprocessing软件包)启动Web服务器。这是包装Web服务器的类:

class Server:
    def __init__(self, port=8888):
        self.application = tornado.web.Application([ (r"/", Handler) ])

        def server_thread(application, port):
            http_server = tornado.httpserver.HTTPServer(application)
            http_server.listen(port)
            tornado.ioloop.IOLoop.instance().start()

        self.process = Process(target=server_thread,
                               args=(self.application, port,))

    def start(self):
        self.process.start()

    def stop(self):
        ioloop = tornado.ioloop.IOLoop.instance()
        ioloop.add_callback(ioloop.stop)

但是,即使使用以下测试设置,停止似乎也无法完全停止Web服务器,因为该Web服务器仍在下一个测试中运行:

def setup_method(self, _function):
    self.server = Server()
    self.server.start()
    time.sleep(0.5)  # Wait for web server to start

def teardown_method(self, _function):
    self.kstore.stop()
    time.sleep(0.5)

如何从Python程序中启动和停止Tornado Web服务器?


问题答案:

我只是遇到这个问题,自己发现了这个问题,并使用了来自该线程的信息。我只是简单地使用了独立的Tornado代码(从所有示例中复制)并将实际的起始代码移到了函数中。然后,我将该函数称为线程线程。我的情况有所不同,因为线程调用是从我现有的代码中完成的,在该代码中我刚刚导入了startTornado和stopTornado例程。

上面的建议似乎效果很好,所以我认为我将提供缺少的示例代码。我在FC16系统上的Linux下测试了此代码(并修复了我的初始type-o)。

import tornado.ioloop, tornado.web

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

application = tornado.web.Application([ (r"/", Handler) ])

def startTornado():
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

def stopTornado():
    tornado.ioloop.IOLoop.instance().stop()

if __name__ == "__main__":
    import time, threading
    threading.Thread(target=startTornado).start()
    print "Your web server will self destruct in 2 minutes"
    time.sleep(120)
    stopTornado()

希望这对下一个人有帮助。



 类似资料:
  • 问题内容: 我显然正在运行一个实例,因为当我尝试通过输入来启动新服务器时,遇到了以下问题: 我不知道如何停止此服务器并启动新服务器。 在CLI中键入命令时,可以追加任何命令吗? 我的操作系统是Ubuntu 10.04。 问题答案: 连接到节点实例并使用shutdown命令,或者如果您在ubuntu上,则可以尝试通过init.d重新启动Redis服务器: 或停止/启动它: 在Mac上

  • 我正在使用插件Goup-server-li的负载。 如何停止服务器? 我尝试了server.restart(),server.kill(),server.reset() 但总是有这样的错误: 未捕获错误:在Object.exports处侦听EADDRINUSE 127.0.0.1:35729_导出时出现errnoException(util.js:1022:11)_服务器上的exceptionWi

  • 问题内容: 我已经到了秃顶几步之遥… 我正在尝试运行一项服务,该服务将检查我工作中的服务器是否正在运行。应该每5分钟执行一次。 我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作了好几个小时,除了一些不准确的地方外,还有1-5分钟的时间,然后突然,“计时器”就停止了发射。 现在,我已经了解到,如果Scheduler遇到未捕获的异常,它将停

  • 本文向大家介绍如何使用PowerShell停止Windows服务?,包括了如何使用PowerShell停止Windows服务?的使用技巧和注意事项,需要的朋友参考一下 要使用PowerShell停止特定服务,您需要使用Stop-Service命令。 语法 示例 要检查服务是否已停止,请键入Get-Service -Name Spooler。 输出结果 您也可以使用-Verbose参数来检查命令进程

  • 安装Jenkins后,我很困惑如何停止/启动Jenkins。使用此脚本在我的终端上进行战争 java-JarJenkins。war-httpPort=8080 原因如果再次运行上述代码,可能是错误原因端口已在使用中。我可以卸载它,但如果我需要Jenkins,我必须卸载它,然后重新安装,这就像浪费时间一样。需要知道如何在不卸载已安装的jenkins的情况下停止/启动命令的人 谢谢

  • 问题内容: 我一直试图找到一种方法来优雅地停止Go中的监听服务器。因为阻塞了,所以有必要关闭侦听套接字以发出结束信号,但由于没有导出相关错误,因此我无法分辨该错误以及其他任何错误。 我可以做得更好吗?请参阅下面的代码 此打印 我想隐藏消息,但是显然我不想掩盖可以报​​告的其他错误。我当然可以在错误测试中进行查找,但这确实很难看。我可以设置一个标志,说如果要设置,我将要关闭并忽略错误-有更好的方法吗