2016-07-24 4 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.AsyncTestCase или AsyncHTTPTestCase.

Чтобы освободить порт, необходимо остановить 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

Смежные вопросы