【问题标题】:Linux: Piping data turns regular dataflow choppyLinux:管道数据使常规数据流断断续续
【发布时间】:2021-08-26 18:30:54
【问题描述】:

我在 Linux (Ubuntu) 上。我有一个 c 程序,它处理与 arduino 的串行通信,让我每秒多次将传感器读数打印到控制台上。传入的数据流非常规律。我还有一个小的 python 程序应该获取这些数据并使用它。为了测试 python 文件只是 print(input()) 在一个无限循环中。如果我然后通过以下方式将串行通信传输到我的 python 程序中:

.sercom | python3 main.py

我输出的数据流变得非常不稳定,线条分批出现,中间有小停顿。这就是管道的工作原理吗?有什么办法可以让流量再次变得顺畅吗?如果不是,我可以使用哪些替代方案来在我的程序之间获得流畅的数据流?

编辑: 以下是如何重现我的意思:创建两个 python 文件

pipe_out.py:

from time import sleep
for n in range(0, 100000):
    print(n, 'testing lines out of 100000')
    sleep(0.001)

pipe_in.py:

for i in range(0, 100000):
  print(input())

然后比较控制台输出的

python3 pipe_out.py

python3 pipe_out.py | python3 pipe_in.py

第一个输出非常平滑,而第二个输出断断续续,大约 500 行的块

【问题讨论】:

  • 基于行的缓冲?无论如何,这里有一个适当的问题,请提取并提供minimal reproducible example
  • 感谢@UlrichEckhardt 提供有关基于行的缓冲的提示。有了这个,我能够修复它。问题确实是普通的 linux 管道使用行缓冲。 Here我找到了一个线程,通过expect包处理没有行缓冲区的管道,这解决了我的问题。

标签: python linux pipe


【解决方案1】:

问题在于管道使用了行缓冲区。 Here 是一篇处理没有行缓冲区的管道的帖子。要点是使用 expect 包并在管道命令前添加 unbuffer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多