【问题标题】:Why is my logging messed up (socket, thread, signal)?为什么我的日志记录混乱(套接字、线程、信号)?
【发布时间】:2014-08-27 07:33:45
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 也许有些控制字符潜伏在周围?您能否将输出重定向到文件并提供数据的十六进制转储。
  • 我在发布这个问题之前尝试了重定向它,这有效并产生了预期的结果,所以它似乎在标准输出中混淆了,因为它混合了两个流或其他什么。什么是十六进制转储:O?感谢您的回复。
  • 您是否并行运行多个侦听器线程以向主线程发出信号?

标签: python multithreading sockets signals pyside


【解决方案1】:

我想我找到了问题所在:

当外部应用程序要发送消息时,它总是会创建一个新的客户端套接字,连接到服务器,发送消息,然后关闭客户端套接字。

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.

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

【讨论】:

  • 不是论坛。如果您已经解决/缩小了问题,但仍需要帮助,请提出其他问题
  • 我不会为弹出的与原始问题相关的每个问题都打开一个新线程。我已经解决了这个问题,但仍然没有真正回答我最初关于它为什么会发生的问题。明明跟关闭socket有关,但是我还是不明白为什么。
猜你喜欢
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多