【发布时间】:2026-02-04 00:00:01
【问题描述】:
我正在运行一个线程,该线程从队列中获取消息,将其发送给客户端,然后接收确认。如果客户端断开连接,线程会捕获套接字错误并终止。问题是如果 msgQ 为空,则线程永远不会检查套接字连接。有没有办法设置此代码,即使队列为空,也会检查套接字? (问题是,没有消息,就没有什么可发送的)
我需要发送一个特殊的乒乓球吗?如果 msgQ 为空,则消息(并在客户端上检查消息是日志数据还是 ping?)?任何帮助,将不胜感激。
def run(self):
while not self._terminate:
try:
msgs = self.msgQ.get()
self.sock.send(pickle.dumps(msgs))
rdy = pickle.loads(self.sock.recv(2097152))
except socket.error, EOFError:
print 'log socketmanager closing'
self.terminate()
break
except Empty: pass
【问题讨论】:
-
self.sock.recv() 是一个阻塞调用,除非你有非阻塞套接字。这意味着如果队列中没有消息,则发出 self.sock.recv() 将阻塞并且在收到某些内容之前不会继续处理。这是你想做的吗?