As a simple example, when I run the following code:
from multiprocessing import Pool
class foo(object):
    def __init__(self):
        self.a = 0
    def g(self, x):
        return x + self.a
    def bar(self):
        def f(x):
            return self.g(x)**2
        # Compute [f(x) for x in range(1000)] in parallel
        pool = Pool()
        res = pool.map(f, range(1000))
        pool.close()
        pool.join()
        return res
res = foo().bar()
I get the error:
---------------------------------------------------------------------------
PicklingError                             Traceback (most recent call last)
<ipython-input-7-cbbd76310b60> in <module>()
     19         return res
     20
---> 21 res = foo().bar()
<ipython-input-7-cbbd76310b60> in bar(self)
     13         # Compute [f(x) for x in range(1000)] in parallel
     14         pool = Pool()
---> 15         res = pool.map(f, range(1000))
     16         pool.close()
     17         pool.join()
/Users/jiaseny/anaconda2/lib/python2.7/multiprocessing/pool.pyc in map(self, func, iterable, chunksize)
    251         '''
    252         assert self._state == RUN
--> 253         return self.map_async(func, iterable, chunksize).get()
    254
    255     def imap(self, func, iterable, chunksize=1):
/Users/jiaseny/anaconda2/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout)
    570             return self._value
    571         else:
--> 572             raise self._value
    573
    574     def _set(self, i, obj):
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
I believe it's because the function f called self.g during computation.
Is there any way to resolve this issue? 
One work-around would be to make g a local function inside bar, but in more complicated classes this would be impractical since g would probably also contain some other function self.h and so on...