Python Twisted,ProcessProtocol如何接收不带缓冲的标准输出?
我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应。但是,Python Twisted,ProcessProtocol如何接收不带缓冲的标准输出?,python,twisted,multiprocessing,buffering,Python,Twisted,Multiprocessing,Buffering,我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应。但是,ProcessProtocol的.outReceived()似乎已缓冲。文件说明: .outReceived(数据):使用从接收到的数据调用 流程的标准管道管道倾向于以更大的格式提供数据 块比套接字大(1 KB是一种常见的缓冲区大小),因此 可能不会经历典型的“随机点滴”行为 网络套接字,但无论如何,如果您 不要在一次通话中获取所有数据。要做得好,, outReceived应该简单地积累数据并推迟进行
ProcessProtocol
的.outReceived()
似乎已缓冲。文件说明:
.outReceived(数据):使用从接收到的数据调用
流程的标准管道管道倾向于以更大的格式提供数据
块比套接字大(1 KB是一种常见的缓冲区大小),因此
可能不会经历典型的“随机点滴”行为
网络套接字,但无论如何,如果您
不要在一次通话中获取所有数据。要做得好,,
outReceived应该简单地积累数据并推迟进行
在整个过程结束之前,不要用它做任何事情
结果是,在整个处理完成后,我在一个块中获得输出。如何强制ProcessProtocol
不缓冲标准输出
我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应
结果是,在整个处理完成后,我在一个块中获得输出。如何强制ProcessProtocol不缓冲标准输出
缓冲发生在生产者过程中,而不是消费者。标准C库stdout
仅在连接到终端时才进行线路缓冲,否则将完全缓冲。这就是当生产者进程未连接到终端时,它以大块而不是逐行输出数据的原因
使用实用程序强制生产者进程“stdout
进行行缓冲
如果生产者进程是python脚本,请使用
-u
python解释器开关完全关闭标准流的缓冲<代码>stdbuf实用程序更好。不是直接的答案,但肯定包含指向它的清晰指针。正如您所说,stdout在连接到终端时是行缓冲的,因此使用spawnProcess
和usePTY=True
解决了这个问题。我不熟悉twisted,无法判断usePTY
是否有用。标准C库使用isatty()
函数检测它是否连接到终端。因此,另一个选项是LD_PRELOAD
一个库,该库超级强制isatty()
始终返回1
。我刚刚检查并得到usePTY
帮助,我得到了我想要的逐行输出。Sux.UpTy将STDUT和STDRR结合起来,我需要它们分开(一个是协议流,另一个是..错误)。在选择这个解决方案时,请注意这一点,并考虑其中的一个。如果Python—u不是一个选项,考虑OS.FDOPEN(sys .StdOut.Fielo()),'W’,0)。