首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何(我)问一个管道它有多少字节可用于读取?

如何(我)问一个管道它有多少字节可用于读取?
EN

Stack Overflow用户
提问于 2013-11-19 09:28:35
回答 4查看 5.9K关注 0票数 11

我已经用Python实现了一个非阻塞读取器,我需要提高它的效率。

背景:我需要从一个子进程(从Popen()开始)读取大量输出,然后传递到另一个线程。从该子进程读取输出时,不能阻塞超过几毫秒(最好是读取可用字节所需的最短时间)。

目前,我有一个实用工具类,它接受文件描述符(stdout)和超时。我select()readline(1),直到有三件事发生:

  1. 我读了一条换行符
  2. 我的超时时间(几毫秒)到期
  3. select告诉我该文件描述符上没有什么可读取的。

然后,我将缓冲文本返回给调用方法,该方法会对其进行填充。

现在,关于真正的问题:因为我阅读了太多的输出,所以我需要提高效率。我想通过询问文件描述符有多少字节挂起,然后是readline([that many bytes])来做到这一点。它应该只是通过的东西,所以我实际上不关心新的线在哪里,即使有任何。我可以问文件描述符它有多少字节可以读取,如果可以,如何读取?

我做了一些搜索,但我有一个非常困难的时间来寻找什么,更不用说它是可能的。

即使是在正确的方向上的一点也会有帮助。

注意:我正在Linux上进行开发,但是对于"Pythonic“解决方案来说,这并不重要。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-19 09:50:09

在Linux上,os.pipe()只是管道(2)的包装器。两者都返回一对文件描述符。通常,人们会使用would (2)(Python中的os.lseek())重新定位文件删除器的偏移量,作为获取可用数据量的方法。但是,并不是所有的文件描述符都能够找到。

在Linux上,尝试在管道上查找(2)将返回一个错误,请参见手册页。这是因为管道或多或少是数据的生产者和使用者之间的缓冲区。该缓冲区的大小与系统有关。

在Linux上,管道具有64 kB缓冲区。,所以这是你能拥有的最多的数据。

编辑:如果您可以改变子进程的工作方式,您可以考虑使用内存映射文件,或者使用一个很大的共享内存。

Edit2:使用轮询对象可能比选择更快。

票数 5
EN

Stack Overflow用户

发布于 2013-11-19 10:02:33

这个问题似乎提供了一个可能的解决方案,尽管它可能需要重组。

在python中subprocess.PIPE上的非阻塞读取

否则,我假设您知道如何一次读取数据N个字节:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
all_data = ''
while True:
    data = pipe.read(1024)   # Reads 1024 bytes or to end of pipe
    if not data:
        break
    all_data += data
    # Add your timeout break here
票数 0
EN

Stack Overflow用户

发布于 2018-07-30 17:18:50

您可以通过调用os.fstat(file_descriptor)并检查st_size属性(即写入的字节数)来发现这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
reader_file_descriptor, writer_file_descriptor = os.pipe()
os.write(writer_file_descriptor, b'I am some data')
readable_bytes = os.fstat(writer_file_descriptor).st_size
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20078053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文