我有这段代码(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持有的所有端口?还是手动?
答案 0 :(得分:3)
如果您可以使用Python语句释放Tornado端口,那么对您的问题不是真正的答案,但由于它似乎已经解决了您的问题,我认为我还是会写一个简短的答案;
Ctrl-Z
只会使您的程序进入休眠状态,但不会释放任何端口。
如果您另一方面使用Ctrl-C
,程序将完全停止。这将允许您简单地使用shell历史记录再次启动它。
答案 1 :(得分:1)
请记住,您可能还会遇到TIME_WAIT status,因此无法在释放后立即使用套接字。