我的python程序的日志输出(使用内置日志记录模块,但即使在使用简单打印时也会发生)部分搞砸了,如下图所示。注意第一行,第一个单词仍然是正确的然后它混淆了:
我试图想象这种情况发生的情况:
基本上在我的主线程/程序中,我启动一个简单的socketserver.TCPServer来监听传入的消息。该服务器在其自己的线程(QtCore.QThread)上运行,因此我的程序不会被阻止。如果某个其他应用程序发送消息,则TCPServer的请求处理程序将使用QtCore.SIGNAL将消息简单地转发到主线程:
self.emit(QtCore.SIGNAL('received(const QString)'), receivedMessage)
程序然后使用该消息进行一些解析和计算并记录这些消息,从而产生上面看到的乱码。在某些时候,日志记录会恢复正常工作。
我不确定这是否与套接字或线程有关,或者两者兼而有之,但我想这可能是一个常见问题,因此我感谢任何提示,为什么会发生这种情况。
答案 0 :(得分:0)
我想我找到了问题:
当外部应用程序想要发送消息时,它将始终创建一个新的客户端套接字,连接到服务器,发送消息然后关闭客户端套接字。
sock.close()
似乎没有立即关闭,docs说我应该先调用sock.shutdown(how)
,但不幸的是,这也无济于事。我可以在关闭后使用一个小的time.sleep(0.5)
来修复日志记录问题,但我做了类似的事情:
def ensure_closed(self):
while True:
try:
self.sock.recv(1024)
except:
break
def close_connection(self):
self.sock.close()
self.ensure_closed()
# Continue with other stuff.
# Now the logging behaves normally.
可能有更好的方法来做到这一点。