我正在运行一个线程,它从队列中获取消息,将其发送到客户机,然后接收确认。如果客户端断开连接,线程将捕获套接字错误并终止。问题是如果msgQ是空的,线程就不会检查套接字连接。有没有办法设置这个代码,这样即使队列是空的,也会检查套接字?(问题是,没有消息,就没有要发送的内容)
我需要发送一个特殊的ping吗?彭!消息如果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
如果使用的是^{} ,则可以使用可选的}参数调用{a2},或者调用{},它相当于
block
和{Queue.get(block=False)
,如果队列为空,它将立即返回:如果}的调用。您的}。在
msgQ
为空,则对self.msgQ.get()
的调用将引发Empty
异常,并完全跳过对self.sock.send()
和{Empty
异常的异常处理程序不执行任何操作,因此您的代码将busy wait,直到出现在msgQ
中,而不会调用send
或{一种可能的解决方案是使用pythonselect module检查异常处理程序中的套接字。大致如下:
我有个主意,就是把队列和管道包装到一个类中。然后使用select模块检查套接字和管道,不会使用轮询来监视事件。在
以下包装队列和管道的示例代码:
^{pr2}$
相关问题 更多 >
编程相关推荐