interestingly, leaving out the fcntl stuff makes it work much faster. it seems to block only sometimes now, for just a moment, but on the whole the performance is acceptable now.
On 6/29/06, Mark Dufour <[EMAIL PROTECTED]> wrote: > 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()])+';') > -- if vars: self.output('; '.join([self.type(var)+' '+name for (name,var) in vars.items()])+';') -- http://mail.python.org/mailman/listinfo/python-list