gpt4 book ai didi

Python - 错误 98 地址已被使用,如何让它更快?这样在 kill 和快速重启时它不会失败?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:35 25 4
gpt4 key购买 nike

我有一个在 CentOS 6.4/64 位下运行的 Python 协议(protocol)。我在哪里有 TCP 服务器端口 7007。在某些情况下,如更新新版本或维护或即时重新启动以刷新缓冲区,我需要重新启动应用程序:

server.py:

class AServer(threading.Thread):
def __init__(self, port):
threading.Thread.__init__(self)
self.port = port

def run(self):
host = ''
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, self.port))
print bgcolors.BOOT
s.listen(1)
conn, addr = s.accept()
print bgcolors.OK + 'contact', addr, 'on', self.now()

while 1:
try:
data = conn.recv(1024)
except socket.error:
print bgcolors.OK + 'lost', addr, 'waiting..'
s.listen(1)
conn, addr = s.accept()
print bgcolors.OK + 'contact', addr, 'on', self.now()
continue
if not data:
.....
...

t = AServer(7007)
t.start()

即时重启紧急(期望在 1 秒内运行)但失败:

$ ps aux | awk '/server.py/ {print $2}' | head -1 | xargs kill -9;
$ nohup python /var/tmp/py-protocol/server.py &
[root@IPSecVPN protocol]# python server.py
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "server.py", line 236, in run
s.bind((host, self.port))
File "<string>", line 1, in bind
error: [Errno 98] Address already in use

最佳答案

您的套接字处于 TIME_WAIT 状态,这就是为什么即使您的程序已退出,地址仍在使用中的原因。您可以在套接字上设置 SO_REUSEADDR 以在套接字退出 TIME_WAIT 状态之前重用它。 Python documentation建议如下:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))

关于Python - 错误 98 地址已被使用,如何让它更快?这样在 kill 和快速重启时它不会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18676559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com