使用Python快速检测端口是否被占用的方法
我有一个用Python写的服务器,它会监听几个网络端口。在启动的时候,我会先尝试连接这些端口,以确保没有其他程序在使用这些端口。这一过程大约会让我的服务器启动时间增加三秒钟(如果不进行测试,启动时间大约是0.54秒),我想把这个时间缩短。因为我只是测试本地连接,所以我觉得50毫秒的超时时间已经足够了。不过,socket.setdefaulttimeout(50)这个方法似乎没有起作用,原因不太清楚。
我该怎么做才能缩短这个时间呢?
7 个回答
29
这里有一个例子,教你怎么检查一个端口是否被占用。
import socket, errno
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(("127.0.0.1", 5555))
except socket.error as e:
if e.errno == errno.EADDRINUSE:
print("Port is already in use")
else:
# something else raised the socket.error exception
print(e)
s.close()
83
要检查端口,可以使用:
def is_port_in_use(port: int) -> bool:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('localhost', port)) == 0
来源:https://codereview.stackexchange.com/questions/116450/find-available-ports-on-localhost
注意: 使用 connect_ex 可能仍然会出现异常(比如主机名不正确,具体可以查看文档 [1])。
15
你可以试着直接绑定到你想要的端口,如果这个端口已经被占用了,就处理一下错误情况。
(如果你担心的是可能会启动同一个服务两次,那就别去看开放的端口。)
这样做也是个不错的方法,可以避免出现竞争条件,正如@eemz在另一个回答中提到的。