在下面的代码中,尽管线程似乎正在停止套接字,但似乎没有被释放。不知道我在犯什么错误。 当我尝试第二次启动时,它抛出错误“地址已在使用中”。我查找了很多堆栈溢出建议,并没有太大帮助。
这是我的代码:
import threading
import time
import socket
class TCPServer(object):
def __init__(self):
self.stop_thread = threading.Event()
def startServer(self, ip="localhost", port=12345):
self.ip = ip
self.port = port
t = threading.Thread(target=self.server, args=(self.stop_thread,
"stop_event"))
t.daemon = True
t.start()
def server(self, stop_event, arg):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.ip, self.port))
sock.listen(5)
connection = ""
while not stop_event.is_set():
connection, addr = self.sock.accept()
data = connection.recv(50000)
if data:
connection.send(self.response)
connection.close()
#Tried with below statements - still fails
#self.sock.shutdown(socket.SHUT_RDWR)
#self.sock.close()
def stopServer(self):
self.stop_thread.set()
if __name__ == "__main__":
server = TCPServer()
server.startServer("localhost", 12345)
time.sleep(5)
server.stopServer()
time.sleep(15)
server.startServer("localhost", 12345)
time.sleep(5)
server.stopServer()
我通过强制关闭stopServer()
中的套接字来找到解决方法,如下所示:
def stopServer(self):
self.stop_thread.set()
self.sock.shutdown(socket.SHUT_RDWR)
self.sock.close()
但是我认为这不是一个好的解决方案。有什么建议吗?
答案 0 :(得分:0)
for (( i=0; i < 360; i+=$a )) do
name=%(printf "%03d" $i)
convert $image -rotate $i "temp/$name.jpg"
done
convert -delay $d "temp/*.jpg" out.gif
所以大部分都是次要的东西。您需要检查事件是否已设置,而不仅仅是事件是否为真。您可以在event-object docs中阅读更多内容。这意味着您永远不会离开内循环。离开内循环后,您需要显式关闭连接和套接字。