标签: buffering

如何在不缓冲stdout和stderr的情况下记录输出

我在从自动构建中记录输出时遇到问题.

使用Makefile和makefile实用程序完成构建.

问题是像编译器命令行这样的正常输出转到stdout并且编译错误转到stderr.

我想从屏幕上显示的构建中获取输出.所以类似于:

(stdout) CC -c file.cpp
(stderr) Compile error at file.cpp line 232, blah blah blah
(stdout) CC -c file2.cpp
Run Code Online (Sandbox Code Playgroud)

我尝试过(从ksh脚本)是:

make -k> build.log 2> build.log

这导致单个日志文件,但问题是流被缓冲,因此日志文件中的结果全部混淆.

我可以将输出捕获到2个单独的日志文件中,但之后我就没有关于如何将它们粘合到一个日志文件中的信息.

在这种情况下,有没有办法关闭stdout和stderr的缓冲?

logging makefile buffering stderr

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

使用Core Graphics/Cocoa,您可以从后台线程绘制到位图上下文吗?

我正在屏幕上绘制一个CGContext创建的使用CGBitmapContextCreate,然后CGImage从中生成一个CGBitmapContextCreateImage并将其绘制到我的视图中drawRect(我还在绘制其他一些东西 - 这是一种隔离不同级别的可变性和复杂性的练习).

当它全部在主线程上运行时,一切正常.然而,通过这种方式将其拆分的动机之一就是使得屏幕外部分可以在后台线程上运行(我认为它应该没问题,因为它不会渲染到屏幕上下文).

但是,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的NSLog来验证一切都按正确的顺序发生.

我的下一步是将其归结为最简单的代码,以重现问题(或者找到一些我遗漏的傻事并修复它) - 此时我会在必要时在此处发布一些代码.但我首先要在这里检查一下,我不会走错路.我在googlesphere周围的旅行中找不到任何可以解决问题的东西 - 但是朋友确实提到他在尝试在后台线程中调整图像大小时遇到​​了类似的问题 - 这表明这里可能存在一些普遍的限制.

[编辑]

感谢到目前为止的回复.如果没有别的,他们告诉我,至少我并不是唯一一个没有答案的人 - 这是我想要找到的一部分.在这一点上,我将把额外的工作放在获得最简单的可能示例上,并且可能会返回一些代码或更多信息.在此期间保持任何想法:-)

提出一点:有几个人在API方面使用了术语线程安全.应该注意的是,在这种情况下有两种类型的线程安全:

  1. API本身的可线性 - 即它可以在多个线程中使用它(全局状态和其他重入问题,例如C的strtok是API可能也不是线程安全的常见原因).
  2. 单个操作的原子性 - 多个线程可以通过API与相同的对象和资源进行交互而无需应用程序级锁定吗?

我怀疑到目前为止提到的是第一种类型,但如果你能澄清,我将不胜感激.

[edit2 - 解决了!]

好的,我把它全部搞定了.执行摘要是问题出在我身上,而不是位图上下文本身.

在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备.事实证明,间接地调用那些导致在某些视图上调用setNeedsDisplay的其他对象!通过将完成该部分的部分分离到主线程,它现在完全可以正常工作.

所以对于那些遇到这个问题的人来说,想知道他们是否可以在后台线程上绘制位图上下文,答案就是你可以(在这里和答案中提出的警告).

谢谢大家

iphone cocoa multithreading core-graphics buffering

9
推荐指数
1
解决办法
4169
查看次数

什么是适合Python的struct模块的缓冲区

在Python中,我通过将其读入字符串然后使用来访问二进制文件struct.unpack(...).现在我想使用写入该字符串struct.pack_into(...),但我得到错误"不能使用字符串作为可修改的缓冲区".什么是适合struct模块使用的缓冲区?

python binary buffering

9
推荐指数
2
解决办法
7007
查看次数

使用C中的fread从stdin缓冲读取

我试图stdin通过setvbuf在`_IOFBF~模式下使用来有效地读取.我是新来的缓冲.我正在寻找有用的例子.

输入以两个整数(n,k)开头.下一n行输入包含1个整数.目的是打印可以整除的整数数k.

#define BUFSIZE 32
int main(){
  int n, k, tmp, ans=0, i, j;
  char buf[BUFSIZE+1] = {'0'};
  setvbuf(stdin, (char*)NULL, _IONBF, 0);
  scanf("%d%d\n", &n, &k);
  while(n>0 && fread(buf, (size_t)1, (size_t)BUFSIZE, stdin)){
    i=0; j=0;
    while(n>0 && sscanf(buf+j, "%d%n", &tmp, &i)){
    //printf("tmp %d - scan %d\n",tmp,i); //for debugging
      if(tmp%k==0)  ++ans;
      j += i; //increment the position where sscanf should read from
      --n;
    }
  }
  printf("%d", ans);
  return 0; …
Run Code Online (Sandbox Code Playgroud)

c buffering fread

9
推荐指数
1
解决办法
2万
查看次数

三重缓冲真的是一个免费的性能提升吗?

所以我一直在阅读很多关于openGL和gpus以及图形的内容,并且经常提到三重缓冲可以提供免费的性能提升.我知道它为什么有帮助; 实际上,你可以进行v-sync而不限于60或30或20或15等的帧率选择,所以你实际上可以达到55fps.但这实际上有成本吗?直觉上,我希望三重缓冲能够将输出延迟一帧,为所有内容增加一个非常小的延迟.

graphics performance buffering

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

PHP的ob_flush()导致错误

当我ob_flush()在我的localhost(通过MAMP)上调用PHP的函数时,我收到以下错误:

注意:ob_flush()[ref.outcontrol]:无法刷新缓冲区.没有缓冲区要冲洗.

我能找到的唯一解决方案就是用它作为前缀@,但这对我来说似乎不是一个真正的解决方案.是什么导致了这个问题?

php buffering ob-start

9
推荐指数
2
解决办法
7925
查看次数

一次读取多个Python pickle数据,缓冲和换行?

给你上下文:

我有一个大文件f,几个Gigs的大小.它包含通过运行生成的不同对象的连续pickle

for obj in objs: cPickle.dump(obj, f)

我想在阅读此文件时利用缓冲.我想要的是一次将几个拾取的对象读入缓冲区.这样做的最佳方式是什么?我想要一个readlines(buffsize)腌制数据的模拟.事实上,如果挑选的数据确实是换行符,则可以使用readlines,但我不确定这是否属实.

我想到的另一个选择是首先dumps()将pickled对象转换为字符串,然后将字符串写入文件,每个文件用换行符分隔.要读回文件,我可以使用readlines()loads().但是我担心一个腌制的物体可能有这个"\n"角色,它会抛弃这个文件读取方案.我的恐惧没有根据吗?

一种选择是将其作为一个巨大的对象列表来剔除,但这将需要比我能承受的更多的内存.可以通过多线程加速设置,但我不想在缓冲工作正常之前去那里.什么是这种情况下的"最佳实践".

编辑:我还可以将原始字节读入缓冲区并调用其上的负载,但我需要知道负载消耗了多少字节的缓冲区,以便我可以抛弃它.

python newline buffering pickle

9
推荐指数
2
解决办法
6341
查看次数

为什么要缓冲子进程(重定向到无缓冲文件)的标准输出?

来自http://docs.python.org/library/functions.html#open

可选的bufsize参数指定文件所需的缓冲区大小:0表示无缓冲,1表示行缓冲,任何其他正值表示使用(大约)该大小的缓冲区.负bufsize意味着使用系统默认值,通常为tty设备进行行缓冲,并为其他文件进行完全缓冲.如果省略,则使用系统默认值.

我在下面传递0作为bufsize而没有使用flush()当我运行main_process时没有输出写入文件.
什么原因?

# --------------------------------- sub_process.py
import sys
import time

if __name__ == '__main__':
    print 'printed from redirect.py'
    # why is the following flush() needed? 'std-output' is (?) unbuffered...
    sys.stdout.flush() 
    time.sleep(6)


# --------------------------------- main_process.py
import subprocess
import time

if __name__ == '__main__':
    p = subprocess.Popen(
        ['python', 'sub_process.py'],
        stdout=open('std-output', 'w', 0))
    time.sleep(3)
    p.terminate()
Run Code Online (Sandbox Code Playgroud)

python subprocess stdout popen buffering

9
推荐指数
2
解决办法
2259
查看次数

如何避免Python fileinput缓冲

可能重复:
为sys.stdin设置较小的缓冲区大小?

我有一个Python(2.4/2.7)脚本fileinput用于从标准输入或文件中读取.它易于使用,除了一个案例外,效果很好:

tail -f log | filter.py
Run Code Online (Sandbox Code Playgroud)

问题是我的脚本缓冲了它的输入,而(至少在这种情况下)我希望立即看到它的输出.这似乎源于fileinput 在执行任何操作之前使用它readlines()来获取其bufsize值的字节这一事实.我尝试使用1的bufsize,它似乎没有帮助(这有点令人惊讶).

我确实发现我可以编写这样不缓冲的代码:

while 1:
    line = sys.stdin.readline()
    if not line: break
    sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是我丢失了fileinput功能(即它会自动打开传递给我程序的所有文件,如果没有则会自动打开stdin,它甚至可以自动解压缩输入文件).

那么我怎样才能充分利用两者呢?理想情况下,我不需要显式管理我的输入文件列表(包括解压缩),但在以"流"方式使用时不会延迟输入.

python file-io readline buffering

9
推荐指数
1
解决办法
9240
查看次数

在测试环境(Mac OS X)中模拟较差的带宽?

我们为我们网站上的用户提供定制的Flash/HTML5视频播放器.我目前正在为具有"次优"带宽的用户充实经验 - 基本上我们希望客户端代码能够检测由于过度缓冲导致的糟糕用户体验.我想在本地开发环境中测试这个"带宽不足"的处理代码.

有没有人知道在本地环境中模拟 "带宽不足" 的好技术用于测试目的?

更具体地说,我的本地浏览器连接到具有uWSGI,nginx和python/django实例的虚拟机,我希望能够在从这些系统传送内容时注入任意数量的延迟.(我主要关注的是使用nginx,它进行视频内容传输/流媒体).

编辑:开发环境是Mac OS X可能是相关的.

testing nginx buffering video-streaming

9
推荐指数
3
解决办法
2590
查看次数