Как освободить порт и запустить приложение Tornado во второй раз? - PullRequest
2 голосов
/ 02 марта 2012

У меня есть этот код (hello.py):

import os,sys
import tornado.ioloop
import tornado.web
import tornado.httpserver

#http server class
class http_server(tornado.web.RequestHandler):
  def get(self):
    self.write("Hello, getter!")
  def post(self):
    self.write("Hello, poster!")

#create http server
Handlers     = [(r"/",http_server)]
App_Settings = {"debug":True}
HTTP_Server  = tornado.web.Application(Handlers,**App_Settings)

#run http server
HTTP_Server.listen(9999)
tornado.ioloop.IOLoop.instance().start()

Впервые работает нормально с этой командой с терминала :
python hello.py

После этого терминал продолжает ждать выхода Tornado. Когда я открываю http://localhost:9999,, возвращается «Привет, получатель!» как и хотел. Но во второй раз Python показывает ошибку:

Traceback (most recent call last):
  File "hello.py", line 19, in <module>
    HTTP_Server.listen(9999)
  File "/usr/local/.../tornado/web.py", line 1227, in listen
    server.listen(port, address)
  File "/usr/local/.../tornado/netutil.py", line 100, in listen
    sockets = bind_sockets(port, address=address)
  File "/usr/local/.../tornado/netutil.py", line 265, in bind_sockets
    sock.bind(sockaddr)
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

Я нажимаю Ctrl-Z, чтобы отправить hello.py в фоновый режим, но это не освобождает порт. Если я закрываю терминал, порт освобождается. Однако путь к исходному файлу python глубоко вложен в каталогах, поэтому я не хочу закрывать терминал и перезапускать его после каждого отдельного изменения в коде. Некоторые предлагали мне использовать debug = True в настройках приложения, но это, похоже, не связано с тем, что Tornado продолжает удерживать порт.

Я также попробовал "pidof python", затем убил все процессы python, но порт все еще удерживается упрямым Торнадо. Есть ли способ освободить все порты, удерживаемые Торнадо, с помощью некоторого оператора Python? или вручную?

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Не совсем ответ на ваш вопрос, если вы можете освободить порты Tornado с помощью оператора Python, но, поскольку это, похоже, решило вашу проблему, я решил написать короткий ответ в любом случае;

Ctrl-Z только переведет вашу программу в спящий режим, но не освободит порты .

Если вы, с другой стороны, используете Ctrl-C, программа будет полностью остановлена. Это позволит вам просто использовать историю оболочки, чтобы запустить ее снова.

1 голос
/ 05 марта 2012

Помните, что вы можете также получить статус TIME_WAIT , не позволяющий вам использовать сокет сразу после его освобождения.

...