1) Сначала запускал сервер в отдельном процессе и проблем никаких не было, все коррктно завершалось при os.kill(pid), сервер освобождал занимаемый порт, но когда стал вопрос о прикручивании гуи нужно было возвращать логи в интерфес, а так как у процесса другое адресное пространстово, то через механизм сигналов/слотов данные получать не удавалось
2) перешел к потокам и тут столкнулся с другой проблемой не могу корректно завершить работу tornado (не особождает занимаемый порт)
Помогите пожалуйста как стартавать и останавливать торнадо в отдельном потоке:
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) print("Asked Tornado to exit") def main(): t = threading.Thread(target=start_tornado) t.start() time.sleep(5) stop_tornado() t.join() time.sleep(10) t = threading.Thread(target=start_tornado) t.start() time.sleep(5) stop_tornado() t.join()
Traceback:
Starting Torando
Asked Tornado to exit
Tornado finished
Exception in thread Thread-2:
Traceback (most recent call last):
File “/usr/lib/python3.5/threading.py”, line 914, in _bootstrap_inner
self.run()
File “/usr/lib/python3.5/threading.py”, line 862, in run
self._target(*self._args, **self._kwargs)
File “/home/leming/Documents/PycharmProject/berkut_gui/modules/ProxyServer/proxyServer.py”, line 16, in start_tornado
application.listen(8888)
File “/home/leming/.local/lib/python3.5/site-packages/tornado/web.py”, line 1943, in listen
server.listen(port, address)
File “/home/leming/.local/lib/python3.5/site-packages/tornado/tcpserver.py”, line 142, in listen
sockets = bind_sockets(port, address=address)
File “/home/leming/.local/lib/python3.5/site-packages/tornado/netutil.py”, line 197, in bind_sockets
sock.bind(sockaddr)
OSError: Address already in use