我已经用Python实现了一个非阻塞读取器,我需要提高它的效率。
背景:我需要从一个子进程(从Popen()开始)读取大量输出,然后传递到另一个线程。从该子进程读取输出时,不能阻塞超过几毫秒(最好是读取可用字节所需的最短时间)。
目前,我有一个实用工具类,它接受文件描述符(stdout)和超时。我select()
和readline(1)
,直到有三件事发生:
然后,我将缓冲文本返回给调用方法,该方法会对其进行填充。
现在,关于真正的问题:因为我阅读了太多的输出,所以我需要提高效率。我想通过询问文件描述符有多少字节挂起,然后是readline([that many bytes])
来做到这一点。它应该只是通过的东西,所以我实际上不关心新的线在哪里,即使有任何。我可以问文件描述符它有多少字节可以读取,如果可以,如何读取?
我做了一些搜索,但我有一个非常困难的时间来寻找什么,更不用说它是可能的。
即使是在正确的方向上的一点也会有帮助。
注意:我正在Linux上进行开发,但是对于"Pythonic“解决方案来说,这并不重要。
发布于 2013-11-19 09:50:09
在Linux上,os.pipe()
只是管道(2)的包装器。两者都返回一对文件描述符。通常,人们会使用would (2)(Python中的os.lseek()
)重新定位文件删除器的偏移量,作为获取可用数据量的方法。但是,并不是所有的文件描述符都能够找到。
在Linux上,尝试在管道上查找(2)将返回一个错误,请参见手册页。这是因为管道或多或少是数据的生产者和使用者之间的缓冲区。该缓冲区的大小与系统有关。
在Linux上,管道具有64 kB缓冲区。,所以这是你能拥有的最多的数据。
编辑:如果您可以改变子进程的工作方式,您可以考虑使用内存映射文件,或者使用一个很大的共享内存。
Edit2:使用轮询对象可能比选择更快。
发布于 2013-11-19 10:02:33
这个问题似乎提供了一个可能的解决方案,尽管它可能需要重组。
在python中subprocess.PIPE上的非阻塞读取
否则,我假设您知道如何一次读取数据N个字节:
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
发布于 2018-07-30 17:18:50
您可以通过调用os.fstat(file_descriptor)并检查st_size属性(即写入的字节数)来发现这一点。
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
https://stackoverflow.com/questions/20078053
复制相似问题