【问题标题】:Twisted, how can ProcessProtocol receive stdout w/o buffering?扭曲,ProcessProtocol 如何在没有缓冲的情况下接收标准输出?
【发布时间】:2012-03-29 10:34:21
【问题描述】:

我正在使用外部进程,它为每个处理的数据块写入短行输出。我想在每一行之后做出反应,不会有任何额外的延迟。但是,似乎ProcessProtocol.outReceived() 被缓冲了。文档状态:

.outReceived(data): 使用接收自的数据调用 进程的标准输出管道。 管道倾向于提供更大的数据 块比套接字(一千字节是常见的缓冲区大小),所以你 可能不会经历典型的“随机点点滴滴”行为 网络套接字,但无论如何你都应该准备好处理,如果你 不要在一次调用中获取所有数据。要正确地做到这一点, outReceived 应该简单地累积数据并推迟执行 直到过程完成为止。

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

【问题讨论】:

    标签: python twisted multiprocessing buffering


    【解决方案1】:

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

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

    缓冲发生在生产者进程中,而不是消费者。标准 C 库 stdout 仅在连接到终端时才进行行缓冲,否则为全缓冲。这就是导致生产者进程在未连接到终端时以大块而不是逐行输出数据的原因。

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

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

    【讨论】:

    • 不是直接的答案,但肯定包含指向它的明确指针。正如您所说,stdout 在连接到终端时是行缓冲的,因此使用spawnProcessusePTY=True 解决了这个问题。
    • 我不熟悉twisted来判断usePTY是否有用。标准 C 库使用 isatty() 函数来检测它是否连接到终端。因此,另一种选择是 LD_PRELOAD 一个库,它超级强加 isatty() 以始终返回 1
    • 我刚刚检查并usePTY 提供帮助,我正在逐行获取我想要的输出。谢谢。
    • usePTY 将 stdout 与 stderr 相结合,我需要将它们分开(一个是协议流,另一个是.. 错误。)在选择此解决方案时请注意这一点,并考虑其他之一。如果 python -u 不是一个选项,请考虑 os.fdopen(sys.stdout.fileno(), 'w', 0)
    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2015-01-09
    • 2011-07-23
    相关资源
    最近更新 更多