为什么我的日志记录乱了(套接字,线程,信号)?

时间:2014-08-27 07:33:46

标签: python multithreading sockets signals pyside

我的python程序的日志输出(使用内置日志记录模块,但即使在使用简单打印时也会发生)部分搞砸了,如下图所示。注意第一行,第一个单词仍然是正确的然后它混淆了:

logging mess

我试图想象这种情况发生的情况:

situation

基本上在我的主线程/程序中,我启动一个简单的socketserver.TCPServer来监听传入的消息。该服务器在其自己的线程(QtCore.QThread)上运行,因此我的程序不会被阻止。如果某个其他应用程序发送消息,则TCPServer的请求处理程序将使用QtCore.SIGNAL将消息简单地转发到主线程:

self.emit(QtCore.SIGNAL('received(const QString)'), receivedMessage)

程序然后使用该消息进行一些解析和计算并记录这些消息,从而产生上面看到的乱码。在某些时候,日志记录会恢复正常工作。

我不确定这是否与套接字或线程有关,或者两者兼而有之,但我想这可能是一个常见问题,因此我感谢任何提示,为什么会发生这种情况。

1 个答案:

答案 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.

可能有更好的方法来做到这一点。