连续读取命名管道

时间:2015-04-17 01:41:52

标签: python named-pipes fifo

在Python中连续读取命名管道的最佳方法是什么?

这是我目前的代码:

def read_commands():
    try:
        print "Creating read pipe..."
        os.mkfifo(pipe_cmd)    # Create pipe
        print "Pipe created!"
    except:
        print "Pipe already exists"

    with open(pipe_cmd, "r") as pipecmd:
        while True:
            try:
                line = pipecmd.readline()
            except:
                print "Could not read cmd pipe"

            if line != "":
                print line

        #time.sleep(1)

然而,当我运行此代码时,它似乎从我的CPU中获取了大量资源(其中一个将达到100%)。它可以在1秒的睡眠中正常工作。但是,我需要不断读取管道,以确保是否有新数据。有没有更好的方法来实现这一目标?

这是我在C ++中发送到管道的内容:

void write_pipe(){
    ofstream pipe("/tmp/okccmd");  // Open the pipe
    string data = "Hi";
    pipe << data << endl;
    pipe.flush();
}

谢谢!

1 个答案:

答案 0 :(得分:3)

select.poll工作正常(至少对于Linux,不确定Windows是否支持此功能;但是,select.select ist afaik可用)。只需看一下文档,该模块就在标准库中并且有详细记录(不需要知道OS select()函数是如何工作的。)

文档: https://docs.python.org/3/library/select.html

注意:poll()返回文件描述符列表,而不是文件对象。所以,你应该有一个dict,它将文件描述符映射到相应的对象(如果我只是轮询一个文件,我也会这样做。

pollobj = select.poll()
polled_files = dict()

# the following two lines are reuired for every file
pollobj.register(my_file_obj, <EVENTMASK>)
polled_files[my_file_obj.fileno()] = my_file_obj

for fd, evt in pollobj.poll():
    fileobj = polled_files[fd]
    ... process event for fileobj