2016-07-24 77 views
1

我希望能够停止并重新启动Tornado服务器以进行测试和演示。但它似乎并未释放该端口。如何停止(并重新启动!)Tornado服务器?

以下代码基于answer showing how to properly stop Tornado。我只是在底部添加了代码,试图重启Tornado。它失败,出现“错误:地址正在使用”异常。我甚至加了一个电话给ioloop.close()但这并没有帮助。

#! /usr/bin/env python 

import threading 
import tornado.ioloop 
import tornado.web 
import time 


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

def start_tornado(*args, **kwargs): 
    application = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 
    application.listen(8888) 
    print "Starting Torando" 
    tornado.ioloop.IOLoop.instance().start() 
    print "Tornado finished" 

def stop_tornado(): 
    ioloop = tornado.ioloop.IOLoop.instance() 
    ioloop.add_callback(ioloop.stop) 
    ioloop.add_callback(ioloop.close) # I added this but it didn't help. 
    print "Asked Tornado to exit" 

def main(): 

    t = threading.Thread(target=start_tornado) 
    t.start() 

    time.sleep(1) 

    stop_tornado() 
    t.join() 
    print "Tornado thread stopped." 

    t = threading.Thread(target=start_tornado) # Attempt restart. 
    t.start() 

if __name__ == "__main__": 
    main() 

输出:

Starting Torando 
Asked Tornado to exit 
Tornado finished 
Tornado thread stopped. 
Exception in thread Thread-2: 
    Traceback (most recent call last): 
      File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
    self.run() 
    File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/threading.py", line 754, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "./test_tonado_restart.py", line 17, in start_tornado 
    application.listen(8888) 
    File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/site-packages/tornado/web.py", line 1825, in listen 
    server.listen(port, address) 
    File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/site-packages/tornado/tcpserver.py", line 126, in listen 
    sockets = bind_sockets(port, address=address) 
    File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/site-packages/tornado/netutil.py", line 196, in bind_sockets 
    sock.bind(sockaddr) 
    File "/home/mudd/musl/Python-2.7.11.install/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
error: [Errno 98] Address in use 
+0

我不认为你需要在龙卷风来管理你自己的线程。 ioloop为你做到了这一点,我认为 –

回答

2

,除非你真的必要不要使用线程这样的 - 他们复杂的事情还真不少。对于测试,请使用tornado.testing.AsyncTestCaseAsyncHTTPTestCase

要释放端口,您需要停止HTTPServer,而不仅仅是IOLoop。事实上,你甚至可能根本不需要停止IOLoop。 (但通常我会通过让流程退出并重新启动它来重新启动它)。

你的榜样的非线程版本会是这样的:

#! /usr/bin/env python 

import tornado.ioloop 
import tornado.web 
import time 


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

def start_app(*args, **kwargs): 
    application = tornado.web.Application([ 
     (r"/", MainHandler), 
    ]) 
    server = application.listen(8888) 
    print "Starting app" 
    return server 

def stop_tornado(): 
    ioloop = tornado.ioloop.IOLoop.current() 
    ioloop.add_callback(ioloop.stop) 
    print "Asked Tornado to exit" 

def main(): 
    server = start_app() 
    tornado.ioloop.IOLoop.current().add_timeout(
     datetime.timedelta(seconds=1), 
     stop_tornado) 
    tornado.ioloop.IOLoop.current().start() 
    print "Tornado finished" 
    server.stop() 

    # Starting over 
    start_app() 
    tornado.ioloop.IOLoop.current().start() 
+0

谢谢,本。如果发生什么事情,龙卷风会做什么? – JohnMudd

相关问题