slow non-blocking reads

Mark Dufour mark.dufour at gmail.com
Thu Jun 29 12:27:08 EDT 2006


hello all,

I am trying to fire up a child process using os.popen2, and have the
parent and child communicate in a non-blocking fashion. it works, but
somehow it's unbearably slow. the following simulates a blocking
readline:

import os, fcntl

fi, fo = os.popen2('./child')
fcntl.fcntl(fo.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)

def getline():
    line = ''
    while 1:
        try:
            line += os.read(fo.fileno(), 1)
            if line.endswith('\n'):
                return line
        except OSError:
            pass

print getline()

while 1:
    fi.write('echo echo echo\n')
    fi.flush()
    print getline()

and this is the child process, written in C:

        tcgetattr(0, &tty);
        tty.c_lflag &= ~ICANON;
        tty.c_cc[VTIME] = 0;
        tty.c_cc[VMIN] = 0;
        tcsetattr(0, TCSADRAIN, &tty);

        fds[0].fd = 0;
        fds[0].events = POLLIN;

        fcntl(0, F_SETFL, O_NONBLOCK);

        printf("start\n");
        fflush(stdout);

        while(1) {
                if( poll(fds, 1, 0) > 0) {
                    if((fds[0].fd == 0) && (fds[0].revents & POLLIN)) {
                        read(0, &c, 1);

                        printf("%c", c);
                        fflush(stdout);
                    }
                }
        }

the child sends a 'start' message and then echoes the parent.

any thoughts about why this runs extremely slowly?


thanks!
mark dufour.
-- 
if vars: self.output('; '.join([self.type(var)+' '+name for (name,var)
in vars.items()])+';')



More information about the Python-list mailing list