无固定缓冲区大小的非阻塞读取(os.Read)FIFO



在这个问题中,询问者已经解决了以非阻塞方式从命名管道读取的问题,但他使用了固定的缓冲区大小。有没有一种方法可以做到这一点,而不需要固定的缓冲区大小,只需等待另一端用换行符终止自己的缓冲区?

假设您的分隔符是a,您可以以非阻塞的方式读取多个可变长度字符串,如本程序所示,该程序在接收命名管道的输出时计数。

import os
import time
import errno
import sys
io = os.open(expanduser("~/named_pipes/cob_input"), os.O_RDONLY | os.O_NONBLOCK)
# For implementing non-blocking IO
def read_pipe_non_blocking(input_pipe, size):
    try:
        in_buffer = os.read(input_pipe, size)
    except OSError as err:
        if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
            in_buffer = None
        else:
            raise  # something else has happened -- better reraise
    return in_buffer
def get_azimuth(input_pipe):
    in_buffer = read_pipe_non_blocking(input_pipe, 1)
    print(in_buffer)
    if(in_buffer is None):
        sys.stderr.write("n")
        return ""
    else:
        tmp_buffer = None
        while(tmp_buffer != "a"):
            sys.stderr.write("m")
            time.sleep(0.1)
            tmp_buffer = read_pipe_non_blocking(input_pipe, 1)
            if(tmp_buffer != None and tmp_buffer != "a"):
                in_buffer += tmp_buffer
        read_pipe_non_blocking(input_pipe, 1) #Read in the newline character and the toss it
        sys.stderr.write("nReturning {%s}" %in_buffer)
        return in_buffer

i = 0
while 1:
    print i
    time.sleep(1)
    i += 1
    get_azimuth(io)

这个代码是直接从我的代码中复制粘贴的,并不是很清楚。如果有人需要澄清,请留下评论。

最新更新