"Bad file descriptor" in HTTPServer using Multiprocessing.

Adam Tauno Williams awilliam at opengroupware.us
Sun Jan 10 14:45:24 EST 2010


I have a Python multiprocessing application where a master process
starts server sub-processes and communicates with them via Pipes;  that
works very well.  But one of the subprocesses, in turn, starts a
collection of HTTPServer 'workers' (almost exactly as demonstrated in
the docs).  This works perfectly.... so long as the subprocess that
starts the HTTPServer workers is the *first* process started by the
master process.  Otherwise the HTTPServer's serve_forever immediately
abends with: "(9, 'Bad file descriptor')"

I'm confused why the order of starting the processes matter, especially
given that the HTTPServer's are start in a subprocess of a subprocess.
The master doesn't do much of anything between starting each subprocess
(which it does in a loop;  identify all the subprocesses to start, and
start them.).

subprocess
--------------------
......
            self._httpd = HTTPServer((HTTP_HOST, HTTP_PORT), HTTPRequestHandler)
            print 'HTTPServer created.'
        for i in range(10):
            p = multiprocessing.Process(target=serve_forever, args=(self._httpd, i, self))
            self._workers.append(p)
            p.start()

.....
def serve_forever(server, i, control):
    print 'coils.http starting HTTP worker #{0}'.format(i)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        pass
    except Exception, e:
        control.log.exception(e)
        print 'coils.http worker #{0} abended with exception.'.format(i)
        print e
    return


-- 
OpenGroupware developer: awilliam at whitemice.org
<http://whitemiceconsulting.blogspot.com/>
OpenGroupare & Cyrus IMAPd documenation @
<http://docs.opengroupware.org/Members/whitemice/wmogag/file_view>




More information about the Python-list mailing list