Persistent variable in subprocess using multiprocessing?

Piet van Oostrum piet at cs.uu.nl
Thu Jul 16 13:18:04 EDT 2009


>>>>> mheavner <miheavner at gmail.com> (m) wrote:

>m> 'The process' refers to the subprocess. I could do as you say, load
>m> the data structure each time, but the problem is that takes a
>m> considerable amount of time compared to the the actual computation
>m> with the data it contains. I'm using these processes within a loop as
>m> follows:

>m>          # Don't recreate processes or Queues
>m>          pop1 = Queue()
>m>          pop2 = Queue()
>m>          pop_out = Queue()
>m>          p1 = CudaProcess(0, args=(costf,pop1,pop_out))
>m>          p2 = CudaProcess(1, args=(costf,pop2,pop_out))

>m>          # Main loop
>m>          for i in range(maxiter):
>m>                  print 'ITERATION: '+str(i)
>m>                  if log != None:
>m>                          l = open(log,'a')
>m>                  l.write('Iteration: '+str(i)+'\n')
>m>                  l.close()

>m>                  # Split population in two
>m>                  pop1.putmany(pop[0:len(pop)/2])
>m>                  pop2.putmany(pop[len(pop)/2:len(pop)])

>m>                  # Start two processes
>m>                  if not p1.isAlive():
>m>                          p1.start()
>m>                          print 'started %s'%str(p1.getPid())
>m>                  else:
>m>                          p1.run()

That won't work. p1.run() will execute the run method in the Master
process, not in the subprocess. And if it would your could would have a
race condition: between the p1.isAlive() (which must be is_alive btw), and
the p1.run() the process can have stopped.

The proper way to do is to put the work in a Queue and let the processes
get work out of the Queue. The datastructure will remain in the process
then. 

>m>                  if not p2.isAlive():
>m>                          p2.start()
>m>                          print 'started %s'%str(p2.getPid())
>m>                  else:
>m>                          p2.run()
>m>                  .
>m>                  .
>m>                  .

>m> So I'd like to load that data into memory once and keep there as long
>m> as the process is alive (ideally when the subprocess is created,
>m> storing some sort of pointer to it), rather than loading it each time
>m> run is called for a process within the loop. Could be my CudaProcess
>m> class - I'll check out what Diez suggested and post back.

-- 
Piet van Oostrum <piet at cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: piet at vanoostrum.org



More information about the Python-list mailing list