相关疑难解决方法(0)

缓冲与无缓冲IO

我了解到,默认情况下,程序中的I/O是缓冲的,即它们从临时存储器提供给请求程序.我知道缓冲可以提高IO性能(可能通过减少系统调用).我已经看到了禁用缓冲的示例,例如setvbuf在C中.两种模式之间有什么区别?何时应该使用另一种模式?

language-agnostic io buffering

73
推荐指数
2
解决办法
4万
查看次数

如何将一个python脚本的输出传递给另一个python脚本

我陷入了将一个脚本的输出传递到另一个脚本(两个都是python)的问题.

这个问题非常相似,但(1)它没有提供答案(2)我的情况略有不同.所以,我认为开一个新问题会更好.

这是问题所在.
两个脚本几乎完全相同:

receiver.py

import sys
import time

for line in sys.stdin:
    sys.stdout.write(line)
    sys.stdout.flush()
    time.sleep(3)
Run Code Online (Sandbox Code Playgroud)

replicator.py

import sys
import time

for line in sys.stdin:
    sys.stderr.write(line)
    sys.stderr.flush()
    time.sleep(3)
Run Code Online (Sandbox Code Playgroud)

当我一个接一个地在bashcmd中执行这些脚本时,一切都很好.以下两个示例都正常工作,我在输出中看到输入文本:

作品:(每3秒输出一行输出)

cat data.txt | python receiver.py
cat data.txt | python replicator.py
Run Code Online (Sandbox Code Playgroud)

但是一旦我从一个脚本管道到另一个脚本,它们就会停止工作:

不起作用:(在到达文件末尾之前没有任何内容出现)

cat data.txt | python receiver.py | python replicator.py
Run Code Online (Sandbox Code Playgroud)

然后,当我将第一个脚本传递给另一个工具时,它再次工作!

作品:

cat data.txt | python receiver.py | cat -n
cat data.txt | python replicator.py | cat -n
Run Code Online (Sandbox Code Playgroud)

最后,当我删除阻塞sleep()函数时,它再次开始工作:

删除计时器:

time.sleep(0)
Run Code Online (Sandbox Code Playgroud)

它现在有效: …

python

5
推荐指数
1
解决办法
2291
查看次数

标签 统计

buffering ×1

io ×1

language-agnostic ×1

python ×1