os.wait() losing child?
Jason Zheng
Xin.Zheng at jpl.nasa.gov
Wed Jul 11 13:43:44 EDT 2007
Greg,
That explains it! Thanks a lot for your help. I guess this is something
they do to prevent zombie threads?
~Jason
greg wrote:
> Jason Zheng wrote:
>> Hate to reply to my own thread, but this is the working program that
>> can demonstrate what I posted earlier:
>
> I've figured out what's going on. The Popen class has a
> __del__ method which does a non-blocking wait of its own.
> So you need to keep the Popen instance for each subprocess
> alive until your wait call has cleaned it up.
>
> The following version seems to work okay.
>
> import os
> from subprocess import Popen
>
> pids = {}
> counts = [0,0,0]
> p = [None, None, None]
>
> for i in xrange(3):
> p[i] = Popen('sleep 1', shell=True)
> pids[p[i].pid] = i
> print "Starting child process %d (%d)" % (i,p[i].pid)
>
> while (True):
> (pid,exitstat) = os.wait()
> i = pids[pid]
> del pids[pid]
> counts[i]=counts[i]+1
>
> #terminate if count>10
> if (counts[i]==10):
> print "Child Process %d terminated." % i
> if reduce(lambda x,y: x and (y>=10), counts):
> break
> continue
>
> print "Child Process %d (%d) terminated, restarting" % (i, pid),
> p[i] = Popen('sleep 1', shell=True)
> pids[p[i].pid] = i
> print "(%d)" % p[i].pid
>
> --
> Greg
More information about the Python-list
mailing list