如何发布端口然后第二次运行Tornado应用程序?

时间:2012-03-02 07:22:01

标签: python sockets port tornado

我有这段代码(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时,它会返回“Hello,getter!”如所想。但是第二次,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进程,但端口仍被顽固的Tornado所控制。有没有办法用一些Python语句释放Tornado持有的所有端口?还是手动?

2 个答案:

答案 0 :(得分:3)

如果您可以使用Python语句释放Tornado端口,那么对您的问题不是真正的答案,但由于它似乎已经解决了您的问题,我认为我还是会写一个简短的答案;

Ctrl-Z只会使您的程序进入休眠状态,但不会释放任何端口

如果您另一方面使用Ctrl-C,程序将完全停止。这将允许您简单地使用shell历史记录再次启动它。

答案 1 :(得分:1)

请记住,您可能还会遇到TIME_WAIT status,因此无法在释放后立即使用套接字。