2014-08-27 20 views
1

我的python程序的日誌輸出(使用內置日誌記錄模塊,但即使在使用簡單打印時也會出現)部分混亂,如下圖所示。注意:第一行,第一個字仍然是正確的,然後它被混合起來:爲什麼我的日誌記錄混亂了(套接字,線程,信號)?

logging mess

我試圖以可視化的情況下發生這種情況:

在我的主線程situation

基本上/ program我開始一個簡單的socketserver.TCPServer來監聽傳入的消息。該服務器運行在自己的線程(QtCore.QThread),所以我的程序不會被阻止。如果其他應用程序發送消息的TCPSERVER的請求處理程序將信息簡單地轉發到使用QtCore.SIGNAL像主線程:

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

然後程序做了一些分析和計算與該消息並記錄那些,從而產生上面看到的亂碼。在某些時候,日誌恢復正常工作。

我不確定這是否與套接字或線程或兩者有關,但我想這可能是一個常見問題,因此我很感激任何暗示爲什麼發生這種情況。

+0

也許一些潛藏的控制字符?您能否將輸出重定向到文件並提供數據的十六進制數據。 – 2014-08-27 08:34:22

+0

我試圖重定向它之前發佈這個問題,這個工程併產生預期的結果,所以它似乎混在了標準輸出,因爲它混合兩個流或任何其他類型。什麼是hexdump:O?感謝您的回覆。 – br0t 2014-08-27 09:40:56

+0

您是否並行運行多個listerner線程來嘗試發信號通知主線程? – alk 2014-08-27 16:39:18

回答

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. 

可能有更好的方式來做到這一點。

+0

這是*不是*論壇。如果您已經修復/縮小了您的問題,但仍需要一些幫助,請*提出其他問題*。 – 2014-08-27 09:58:09

+0

我不會爲每個彈出的與原始問題相關的問題打開一個新的線程。我已經解決了這個問題,但仍然沒有真正回答我爲什麼會發生這個問題。它顯然與關閉套接字有關,但我仍然不明白爲什麼。 – br0t 2014-08-27 10:26:39