python - 如何释放端口然后第二次运行Tornado应用程序?

标签 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持有的所有端口?还是手动?

最佳答案

如果你可以使用 Python 语句释放 Tornado 端口,这并不是你问题的真正答案,但由于它似乎已经解决了你的问题,我想无论如何我都会写一个简短的答案;

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

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

关于python - 如何释放端口然后第二次运行Tornado应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9529482/

相关文章:

python - 数组 dtype ('|S58' 中竖线的含义是什么)

python - 为什么flask中的GET请求被调用了两次?

python - 获取列表之间第一个和最后一个公共(public)元素索引的最快方法

python套接字和套接字服务器

java - 如何在java中创建同一类对象的多个引用

c# - 将 C 语言的 CRC16 代码移植到 C# .NET

python - marshmallow-sqlalchemy 给出语法错误

c# 点对点编程(最好是去中心化的)

java - 检查端口功能

c# - 使用 C# 列出使用的 TCP 端口