Twisted,ProcessProtocol如何接收没有缓冲的stdout?

时间:2012-03-29 10:34:22

标签: python twisted multiprocessing buffering

我正在使用外部进程为每个处理的数据块写入短行输出。我希望在每条线之后做出反应而不会有任何额外的延迟。但是,.outReceived()的{​​{1}}似乎是缓冲的。文档说:

  

.outReceived(data):使用从中接收的数据调用   过程'stdout管道。 管道倾向于提供更大的数据   块比套接字(一千字节是一个常见的缓冲区大小),所以你   可能不会经历典型的“随意滴漏”行为   网络套接字,但无论你是否应该准备好处理   不要在一次通话中获得所有数据。要做得好,   outReceived应该简单地累积数据并推迟做   任何事情,直到过程结束。

结果是,在完成整个处理后,我在一个块中得到输出。如何强制ProcessProtocol不缓冲标准输出?

1 个答案:

答案 0 :(得分:2)

  

我正在使用外部进程为每个处理的数据块写入短行输出。我希望在每一行之后做出反应而不会有任何额外的延迟。

     

结果是,在完成整个处理后,我在一个块中得到输出。如何强制ProcessProtocol不缓冲stdout?

缓冲发生在生产者流程中,而不是消费者身上。标准C库stdout仅在连接到终端时进行行缓冲,否则它是完全缓冲的。这就是生产者进程在没有连接到终端时以大块而不是逐行输出数据的原因。

使用stdbuf实用程序强制生产者进程'stdout进行行缓冲。

如果生产者进程是python脚本,则使用-u python解释器开关来完全关闭标准流的缓冲。 stdbuf效用更好。