On 2012-11-13 12:19, Jean-Michel Pichavant wrote:
Fellows,

I'm having problems understanding an issue with passing function as parameters.

I'm sending some functions to the multiprocessing module (python 2.5 with the 
proper backport).
I'm iterating on a list of functions, however it seems that only the last 
function implementation is used for
all the subprocesses.

Here's a code that triggers the issue:


import multiprocessing

def f1():
     print 'I am f1'
def f2(foo):
     print 'I am f2 %s' % foo

workers = [
         (f1,tuple()),
         (f2,(5,)),
         ]

procs=[]
for func, parameters in workers:
     # here it should be decorated, but for this example to be kept simple, the 
function is only wrapped, doing nothing special
     def subproc(*args, **kwargs):
         return func(*args, **kwargs)
     procs.append(multiprocessing.Process(target=subproc, args=parameters))

for proc in procs:
     proc.start()
for proc in procs:
     proc.join()


Here's the result:
run test.py
Process Process-1:
Traceback (most recent call last):
   File 
"/usr/lib/python2.5/site-packages/multiprocessing-2.6.2.1-py2.5-linux-i686.egg/multiprocessing/process.py",
 line 237, in _bootstrap
     self.run()
   File 
"/usr/lib/python2.5/site-packages/multiprocessing-2.6.2.1-py2.5-linux-i686.egg/multiprocessing/process.py",
 line 93, in run
     self._target(*self._args, **self._kwargs)
   File "test.py", line 17, in subproc
     return func(*args, **kwargs)
TypeError: f2() takes exactly 1 argument (0 given)
I am f2 5

It looks like the first subprocess is called with f2 instead of f1.

I believe the problem is that 'subproc' calls 'func', which is rebound on the each iteration.

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

Reply via email to