为什么我的控制台应用程序正在缓冲日志和套接字消息?

Why my console application is buffering log and socket messages?

背景:

我有一个 Python(控制台)应用程序,其中包含一个套接字服务器。此应用程序从第 3 方客户端接收消息(来自某个进程 A 的启动和停止消息)以控制记录数据任务(如开始和停止记录)。您可以将其视为通过套接字接收消息以开始和停止记录来自同一进程 A 的数据大约 5 分钟。第 3 方客户端发送消息将近 2 小时然后停止,最后,Python 应用程序将在每个会话中生成一组文件。

此应用程序 运行 24/7(在 Windows 10 台式机上无人值守)并且还有一个日志控制台打开,但我注意到有时(尚未确定一个模式)在 运行 4 或 5 天后,我使用 TeamViewer 远程访问系统,控制台 window 显示最后一条消息是 1-2 天前的。但是,一旦我单击控制台或在该控制台中按下一个键,我就会收到一整批来自过去几天错过的会话的消息,因此,收到启动和停止消息 "simultaneously" 导致垃圾数据文件。

代码:

这是代码的套接字服务器部分。我知道我正在设置一个 1024 的缓冲区,但是在正常操作中,这个缓冲区应该不会满才能读取数据

            with conn:
                #display client information
                logger.info('Connected with ' + addr[0] + ':' + str(addr[1]))

                while self.enable:
                    #now keep talking with the client
                    data = conn.recv(1024)

                    if data:
                        self.data_cb(data)
                    else:                            
                        logger.debug("no data, closing connection." )
                        break

问题:

是什么导致了这种缓冲行为? 难道是...

有没有人经历过这样的事情?

真的很感激任何想法,因为我不知道为什么会这样?谢谢


编辑 - 附加信息:

TL;DR

Command Prompt window 的选择功能以某种方式阻止应用程序打印日志消息 and/or 从套接字读取数据(两者在同一线程中)。


好吧,我找到了这种缓冲行为的原因,但我不确定它是否已知(这不是我的问题,所以我稍后会 post 关于该选择的具体问题功能)。

今天检查系统时发现控制台消息在3天前被冻结了,所以我点击了控制台window,然后按一个键,3天的所有消息一次显示。然后,我怀疑控制台输出的选择功能。

我像往常一样启动应用程序并按照以下步骤操作:

  • 我选择了应用控制台中的部分内容
  • 使用另一个控制台,我使用 ncat 从虚拟客户端连接(此时预期的 client connected 消息没有出现)
  • 我发送了虚拟消息(也没有显示)
  • 我完成了 ncat 连接 (CTRL-C)
  • 单击应用程序控制台并按任意键

瞧!所有日志消息(关于连接和数据出现),以及我使用 ncat 发送的所有消息都作为一条大消息收到。


编辑:不需要创建问题,这是已知的 "feature"。有很好的问题 here, here and 。最后一个显示如何禁用此 "feature".