首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python管道-增量读取输出时会发生什么?

问Python管道-增量读取输出时会发生什么?
EN

Stack Overflow用户
提问于 2009-10-23 09:33:58
回答 3查看 962关注 0票数 0

据一节 in 这本大概是准确的书说,

管道的一种常用方法是增量地读取压缩文件;也就是说,不需要立即解压缩整个文件。下面的函数以压缩文件的名称作为参数,并返回一个使用gunzip解压缩内容的管道: def open_gunzip(文件名):cmd = 'gunzip -c‘+ filename fp = os.popen(cmd)返回fp 如果每次只读取fp中的一行,就不必将未压缩的文件存储在内存或磁盘上.。

也许我只是误解了这一点,但我不认为这是可能的。Python不可能在吐出结果的过程中停顿一下,对吗?我假设,在继续输出更多行之前,在读取一行输出之前,gunzip是不会阻塞的,所以某些缓冲区必须捕获所有这些(无论是在Python解释器中还是在操作系统中,无论是在内存中还是在磁盘中),这意味着未压缩的文件被存储在在full...right中的某个地方?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-23 10:03:38

你的假设是错误的。不需要看到整个文件就可以解压缩。读取解压缩文件格式。有一个目录,其中包含对各个组件的偏移。

可以将文件解压缩成碎片。

“未压缩文件存储在full...right的某个地方?”

不一定。不知道你为什么要假设它或者你在哪里读到的。

所有低级别的I/O调用都可以阻止。当向管道写入时,当管道缓冲器已满时,可以阻止用喷管压缩的写入。这就是定义管道I/O的方式。管道I/O块。

有关详细信息,请查看手册页中的管道。

如果进程试图从空管道读取,那么read(2)将 阻塞,直到数据可用为止。如果进程试图写入 完整管道(见下文),然后编写(2)块,直到有足够的数据 从管道中读取,以便完成写入。非阻塞 通过使用fcntl(2) F_SETFL操作启用 O_NONBLOCK打开文件状态标志。

票数 2
EN

Stack Overflow用户

发布于 2009-10-23 10:44:31

这实际上来自于gunzip实现,而不是python。它是用C编写的。它可能使用C的fwrite()来编写它的输出。

我使用的libc6实现会自动创建一个输出缓冲区,当它被填充时,会阻塞fwrite(),直到它能够编写更多的输出缓冲区为止。

票数 1
EN

Stack Overflow用户

发布于 2012-01-10 20:23:01

挂起gunzip的不是Python,而是当内核尝试将(使用write() syscall)写入一个完整缓冲区时,它将停止执行write()。这被称为IO上的阻塞。内核维护连接管道两端的内部缓冲区,不依赖于在写入或读取管道的任何进程中发生的任何缓冲。

Python在读取具有空缓冲区的管道时同样会阻塞,即当前没有从gunzip写入的任何数据。

管道可以被看作是生产者-消费者问题的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1612349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档