为什么我的控制台应用程序正在缓冲日志和套接字消息?
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
问题:
是什么导致了这种缓冲行为?
难道是...
- 第 3 方客户端?
- 我的 Python 应用程序?
- Windows 网络内容中的内容?
有没有人经历过这样的事情?
真的很感激任何想法,因为我不知道为什么会这样?谢谢
编辑 - 附加信息:
- 该应用程序 运行 在真正的桌面计算机上(没有虚拟机)
- 该应用程序已经能够连续工作将近一个月(只是由于有效的外部原因、停电、版本更新等而停止)
- 上次我通过 Teamviewer 访问并注意到该应用程序一天没有接收消息(该应用程序当时 运行 4 天),但我认为这是出于另一个原因并且打算去现场看看(因为之前也发生过类似的事情)。第二天访问,还是一样。但是在第三天,我单击控制台并尝试查看消息,前两天的整批消息立即出现在日志中。
- 该应用已 运行 2 周,并且在过去 4 天内未通过 TeamViewer 访问 PC,以防访问它可以防止问题发生。
TL;DR
Command Prompt
window 的选择功能以某种方式阻止应用程序打印日志消息 and/or 从套接字读取数据(两者在同一线程中)。
好吧,我找到了这种缓冲行为的原因,但我不确定它是否已知(这不是我的问题,所以我稍后会 post 关于该选择的具体问题功能)。
今天检查系统时发现控制台消息在3天前被冻结了,所以我点击了控制台window,然后按一个键,3天的所有消息一次显示。然后,我怀疑控制台输出的选择功能。
我像往常一样启动应用程序并按照以下步骤操作:
- 我选择了应用控制台中的部分内容
- 使用另一个控制台,我使用
ncat
从虚拟客户端连接(此时预期的 client connected
消息没有出现)
- 我发送了虚拟消息(也没有显示)
- 我完成了
ncat
连接 (CTRL-C)
- 单击应用程序控制台并按任意键
瞧!所有日志消息(关于连接和数据出现),以及我使用 ncat
发送的所有消息都作为一条大消息收到。
编辑:不需要创建问题,这是已知的 "feature"。有很好的问题 here, here and 。最后一个显示如何禁用此 "feature".
背景:
我有一个 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
问题:
是什么导致了这种缓冲行为? 难道是...
- 第 3 方客户端?
- 我的 Python 应用程序?
- Windows 网络内容中的内容?
有没有人经历过这样的事情?
真的很感激任何想法,因为我不知道为什么会这样?谢谢
编辑 - 附加信息:
- 该应用程序 运行 在真正的桌面计算机上(没有虚拟机)
- 该应用程序已经能够连续工作将近一个月(只是由于有效的外部原因、停电、版本更新等而停止)
- 上次我通过 Teamviewer 访问并注意到该应用程序一天没有接收消息(该应用程序当时 运行 4 天),但我认为这是出于另一个原因并且打算去现场看看(因为之前也发生过类似的事情)。第二天访问,还是一样。但是在第三天,我单击控制台并尝试查看消息,前两天的整批消息立即出现在日志中。
- 该应用已 运行 2 周,并且在过去 4 天内未通过 TeamViewer 访问 PC,以防访问它可以防止问题发生。
TL;DR
Command Prompt
window 的选择功能以某种方式阻止应用程序打印日志消息 and/or 从套接字读取数据(两者在同一线程中)。
好吧,我找到了这种缓冲行为的原因,但我不确定它是否已知(这不是我的问题,所以我稍后会 post 关于该选择的具体问题功能)。
今天检查系统时发现控制台消息在3天前被冻结了,所以我点击了控制台window,然后按一个键,3天的所有消息一次显示。然后,我怀疑控制台输出的选择功能。
我像往常一样启动应用程序并按照以下步骤操作:
- 我选择了应用控制台中的部分内容
- 使用另一个控制台,我使用
ncat
从虚拟客户端连接(此时预期的client connected
消息没有出现) - 我发送了虚拟消息(也没有显示)
- 我完成了
ncat
连接 (CTRL-C) - 单击应用程序控制台并按任意键
瞧!所有日志消息(关于连接和数据出现),以及我使用 ncat
发送的所有消息都作为一条大消息收到。
编辑:不需要创建问题,这是已知的 "feature"。有很好的问题 here, here and