Se la tua piattaforma non è Windows, potresti probabilmente selezionare contro le pipe stdout dei tuoi sottoprocessi. La vostra applicazione sarà quindi bloccare fino a quando:
- Uno dei descrittori di file registrati ha un evento di I/O (in questo caso, siamo interessati ad un hangup sul tubo di stdout del sottoprocesso)
- I tempi sondaggio out
non a polpa-out esempio utilizzando epoll con Linux 2.6.xx:
import subprocess
import select
poller = select.epoll()
subprocs = {} #map stdout pipe's file descriptor to the Popen object
#spawn some processes
for i in xrange(5):
subproc = subprocess.Popen(["mylongrunningproc"], stdout=subprocess.PIPE)
subprocs[subproc.stdout.fileno()] = subproc
poller.register(subproc.stdout, select.EPOLLHUP)
#loop that polls until completion
while True:
for fd, flags in poller.poll(timeout=1): #never more than a second without a UI update
done_proc = subprocs[fd]
poller.unregister(fd)
print "this proc is done! blah blah blah"
... #do whatever
#print a reassuring spinning progress widget
...
#don't forget to break when all are done
fonte
2010-07-07 14:24:45
sì, il problema è che non riesco a scrivere "#processo finito" durante le esecuzioni perché supponiamo che il primo sottoprocesso sia molto lento, p è uguale al primo 'ps' e python è in attesa e bloccato fino al primo finiture; python non può scrivere che tutti i sottoprocessi tranne il primo siano finiti. –