问题:有没有办法使用flush=True
该print()
功能而无法获得BrokenPipeError
?
我有一个脚本pipe.py
:
for i in range(4000):
print(i)
Run Code Online (Sandbox Code Playgroud)
我从Unix命令行这样称呼它:
python3 pipe.py | head -n3000
Run Code Online (Sandbox Code Playgroud)
它返回:
0
1
2
Run Code Online (Sandbox Code Playgroud)
这个脚本也是如此:
import sys
for i in range(4000):
print(i)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此脚本并将其传递给head -n3000
:
for i in range(4000):
print(i, flush=True)
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
print(i, flush=True)
BrokenPipeError: [Errno 32] Broken pipe
Exception BrokenPipeError: BrokenPipeError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
Run Code Online (Sandbox Code Playgroud)
我也试过下面的解决方案,但我仍然得到BrokenPipeError
:
import sys
for i in range(4000):
try:
print(i, flush=True)
except BrokenPipeError:
sys.exit()
Run Code Online (Sandbox Code Playgroud) 我最近阅读了一篇文章,其中指出使用比使用\n
更好,std::endl
因为它endl
也会刷新流.
但当我找到关于该主题的更多信息时,我发现了一个网站,其中说明:
如果您处于必须避免缓冲的情况,可以使用std :: endl而不是'\n'
现在我的问题出现了:在哪种情况下最好不要写入缓冲区?因为我只看到了那种技术的优点.写入缓冲区不是更安全吗?因为它比硬盘驱动器小,所以它会比存储在HD上的数据更快地被覆盖(我不确定这是否属实).
注意:我已经阅读了以下两个问题:
我在C#中编码
我正在我的应用程序中构建一个类,它包含一个GetStream()
返回流的主方法(让我们调用它)myWebRequest.GetResponse().GetResponseStream()
主方法GetStream()
返回一个Stream
对象,该对象可用于需要流的任何操作(StreamReader,Bitmap()等).
有没有办法让流在最后一次使用后自动处理(垃圾收集?)而不强迫任何人调用.GetStream()
手动处理它?
你可能会说,我的问题是模糊和笼统的.我对流的理解并不牢固,所以任何链接到有用的文章,提供更深入的视图流,而不是SO问题可以提供.
我刚读完这篇文章:https://developer.yahoo.com/performance/rules.html#flush,并且在我的页面顶部加载后已经实现了刷新(head,css,top banner/search/nav) .
冲洗时是否有任何性能损失?是否经常这么做?什么是最佳做法?
如果我打算使用外部API获取数据,那么事先进行刷新是否有意义,以便用户不等待该数据返回,并且至少可以获得一些数据?
我有Perl脚本,每隔3秒就会在现有文件中添加一行新内容.此外,还有一个从该文件中读取的C++应用程序.
问题是应用程序在脚本完成并且文件句柄关闭后开始读取文件.为了避免这种情况,我想在每行附加后刷新,但我是Perl的新手,不知道该怎么做.
这是我在Chrome 11和Firefox 4中测试过的代码片段:
var http = require('http');
http.createServer(function(request, response){
// Write Headers
response.writeHead(200);
// Write Hello World!
response.write("Hello World!");
// End Response after 5 seconds
setTimeout(function(){
response.end();
}, 5000);
}).listen(8000);
Run Code Online (Sandbox Code Playgroud)
你可以看到我超时了response.end()
所以我可以测试是否response.write
输出之前response.end
.根据我的经验,虽然不是.
有没有办法在结束响应之前输出数据,比如在数据包中发送数据?
据我所知,.NET FileStream的Flush方法只将当前缓冲区写入磁盘,但依赖于Windows的磁盘驱动程序和硬盘固件,这并不能保证数据实际上是物理写入磁盘的.
是否有.NET或Win32方法可以给我这个保证?因此,如果在调用此方法后一纳秒之后出现断电,我仍然可以确定一切正常吗?
使用PHP,我想创建一个while循环,它读取一个大文件并在请求时发送当前行号.使用Ajax,我想获取当前行数并将其打印到页面上.使用html按钮,我希望能够单击并激活或终止仅运行ONCE并调用ajax方法的javascript线程.
我已经给了它一个镜头,但由于某种原因,除非我注释掉该echo str_repeat(' ',1024*64);
函数并且当它被注释掉时它没有打印,它显示了整个循环结果:
1行已处理.2行已处理.3行已处理.4行已处理.5行已处理.6行已处理.7行已处理.8已处理的行.9行已处理.10行已处理.
在一行中,而不是在单独的行中显示它们,如:
1 row(s) processed.
2 row(s) processed.
3 row(s) processed.
4 row(s) processed.
5 row(s) processed.
6 row(s) processed.
7 row(s) processed.
8 row(s) processed.
9 row(s) processed.
10 row(s) processed.
Run Code Online (Sandbox Code Playgroud)
另外我不知道如何终止JavaScript线程.总共有2个问题:
1. It's returning the entire While loop object at once instead of each time it loops.
2. I'm not sure how to terminate the JQuery thread.
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?以下是我的代码.
msgserv.php
<?php
//Initiate Line Count
$lineCount = …
Run Code Online (Sandbox Code Playgroud) 我有一些C++代码使用cout
语句进行调试,由于某些原因我不能打印所有数据,除非我最后做了std::cout.flush();
.
我不太明白为什么需要这种刷新操作.
有人有任何见解吗?
flush ×10
c# ×3
c++ ×2
filestream ×2
php ×2
.net ×1
ajax ×1
broken-pipe ×1
dispose ×1
file ×1
io-buffering ×1
loops ×1
node.js ×1
optimization ×1
perl ×1
python ×1
python-3.x ×1
response ×1
stdout ×1
stream ×1
theory ×1
unix ×1
while-loop ×1