multiprocessing and Array problems

2012-04-12 Thread Al Niessner

I am not subscribed to these lists but I do check them occasionally and
will check them more frequently looking for a response.

I am getting a pickling error that I do not understand. It seems the
shared arrays that I create cannot be pickled. Makes the
multiprocessing.Array fairly useless if it cannot be pickled. Hence, I
am guessing that I am doing something wrong and would like some help
spotting it.

This is basically a cut and paste from the examples in the
documentation:

import ctypes
import multiprocessing

def subproc (a, i):
print (From subprocess  + str(i))
print (a[:])
return

if __name__ == __main__:
nproc = 3
print (\nBuilding the array for the second computation.)
b = multiprocessing.Array (ctypes.c_double, nproc*nproc, lock=False)

print (\nSending the task across to see what happens.)
pool = multiprocessing.Pool(nproc)
for i in range(nproc): pool.apply_async (subproc, kwds={'a':b,
'i':i})
pool.close()
pool.join()
pass

Whether I run it on 2.6, 2.7, or 3.2 I get the same error.

Exception in thread Thread-1:
Traceback (most recent call last):
  File /usr/lib/python2.6/threading.py, line 532, in __bootstrap_inner
self.run()
  File /usr/lib/python2.6/threading.py, line 484, in run
self.__target(*self.__args, **self.__kwargs)
  File /usr/lib/python2.6/multiprocessing/pool.py, line 225, in
_handle_tasks
put(task)
PicklingError: Can't pickle class
'multiprocessing.sharedctypes.c_double_Array_9': attribute lookup
multiprocessing.sharedctypes.c_double_Array_9 failed


Anyone want to take a stab as to why this error message is being
generated? Again I have tried python 2.6.7, 2.7.2+, and 3.2.2.

Thanks for any and all help in advance.

-- 
Al Niessner

I have never found the companion that was so companionable as solitude.
- From Walden by Henry David Thoreau

The universe is indifferent, and life is brutal; however, it is man's
choice of behavior that makes them malevolent rather than benevolent.

Some will fall in love with life and drink it from a fountain
That is pouring like an avalanche coming down the mountain.
- From the song Pepper by the Butthole Surfers


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: multiprocessing and Array problems

2012-04-12 Thread Al Niessner

Here is an update.

def subproc (i):
print (From subprocess  + str(i))
print (b[:])
return

if __name__ == __main__:
nproc = 3
print (\nBuilding the array for the second computation.)
b = multiprocessing.Array (ctypes.c_double, nproc*nproc, lock=False)

print (\nSending the task across to see what happens.)
pool = multiprocessing.Pool(nproc)
for i in range(nproc): pool.apply_async (subproc, kwds={'i':i})
pool.close()
pool.join()
pass

Does work. It is not what I need though. I need to be able to pass b as
an argument. The reason is that I create some of these in a loop and
they are not in a global space nor are they know prior to creating the
pool.

On Thu, 2012-04-12 at 11:15 -0700, Al Niessner wrote:
 I am not subscribed to these lists but I do check them occasionally and
 will check them more frequently looking for a response.
 
 I am getting a pickling error that I do not understand. It seems the
 shared arrays that I create cannot be pickled. Makes the
 multiprocessing.Array fairly useless if it cannot be pickled. Hence, I
 am guessing that I am doing something wrong and would like some help
 spotting it.
 
 This is basically a cut and paste from the examples in the
 documentation:
 
 import ctypes
 import multiprocessing
 
 def subproc (a, i):
 print (From subprocess  + str(i))
 print (a[:])
 return
 
 if __name__ == __main__:
 nproc = 3
 print (\nBuilding the array for the second computation.)
 b = multiprocessing.Array (ctypes.c_double, nproc*nproc, lock=False)
 
 print (\nSending the task across to see what happens.)
 pool = multiprocessing.Pool(nproc)
 for i in range(nproc): pool.apply_async (subproc, kwds={'a':b,
 'i':i})
 pool.close()
 pool.join()
 pass
 
 Whether I run it on 2.6, 2.7, or 3.2 I get the same error.
 
 Exception in thread Thread-1:
 Traceback (most recent call last):
   File /usr/lib/python2.6/threading.py, line 532, in __bootstrap_inner
 self.run()
   File /usr/lib/python2.6/threading.py, line 484, in run
 self.__target(*self.__args, **self.__kwargs)
   File /usr/lib/python2.6/multiprocessing/pool.py, line 225, in
 _handle_tasks
 put(task)
 PicklingError: Can't pickle class
 'multiprocessing.sharedctypes.c_double_Array_9': attribute lookup
 multiprocessing.sharedctypes.c_double_Array_9 failed
 
 
 Anyone want to take a stab as to why this error message is being
 generated? Again I have tried python 2.6.7, 2.7.2+, and 3.2.2.
 
 Thanks for any and all help in advance.
 

-- 
Al Niessner

I have never found the companion that was so companionable as solitude.
- From Walden by Henry David Thoreau

The universe is indifferent, and life is brutal; however, it is man's
choice of behavior that makes them malevolent rather than benevolent.

Some will fall in love with life and drink it from a fountain
That is pouring like an avalanche coming down the mountain.
- From the song Pepper by the Butthole Surfers


-- 
http://mail.python.org/mailman/listinfo/python-list