can't delete from a dictionary in a loop
castironpi
castironpi at gmail.com
Sat May 17 04:33:44 EDT 2008
On May 17, 3:06 am, George Sakkis <george.sak... at gmail.com> wrote:
> On May 16, 5:22 pm, "Dan Upton" <up... at virginia.edu> wrote:
>
>
>
>
>
> > This might be more information than necessary, but it's the best way I
> > can think of to describe the question without being too vague.
>
> > The task:
>
> > I have a list of processes (well, strings to execute said processes)
> > and I want to, roughly, keep some number N running at a time. If one
> > terminates, I want to start the next one in the list, or otherwise,
> > just wait.
>
> > The attempted solution:
>
> > Using subprocess, I Popen the next executable in the list, and store
> > it in a dictionary, with keyed on the pid:
> > (outside the loop)
> > procs_dict={}
>
> > (inside a while loop)
> > process = Popen(benchmark_exstring[num_started], shell=true)
> > procs_dict[process.pid]=process
>
> > Then I sleep for a while, then loop through the dictionary to see
> > what's terminated. For each one that has terminated, I decrement a
> > counter so I know how many to start next time, and then try to remove
> > the record from the dictionary (since there's no reason to keep
> > polling it since I know it's terminated). Roughly:
>
> > for pid in procs_dict:
> > if procs_dict[pid].poll() != None
> > # do the counter updates
> > del procs_dict[pid]
>
> Since you don't look up processes by pid, you don't need a dictionary
> here. A cleaner and efficient solution is use a deque to pop processes
> from one end and push them to the other if still alive, something like
> this:
>
> from collections import deque
>
> processes = deque()
> # start processes and put them in the queue
>
> while processes:
> for i in xrange(len(processes)):
> p = processes.pop()
> if p.poll() is None: # not finished yet
> processes.append_left(p)
> time.sleep(5)
>
> HTH,
> George- Hide quoted text -
>
> - Show quoted text -
No underscore in appendleft.
More information about the Python-list
mailing list