Python multiprocessing: calling pool.map within a function
Question: I am trying to use the `mutltiprocessing` package to use multiple CPUs within
a function. When I run a toy example outside of a function it runs in a
quarter of a second with no problems (see below).

    
    
    from multiprocessing import Pool
    import time
    
    start = time.clock()
    
    def f(x):
        return x*x
    
    if __name__ == '__main__':
        with Pool(processes=7) as pool:     
            result = pool.map(f, range(1000))
    
    
    
    print(time.clock() - start)
    

However, when I adapt the same code into a function (see below), it prints
`True` to indicate that `__name__ == '__main__'`, but then it runs forever and
never returns a result. I am running Python 3.3 on Windows 7.

    
    
    from multiprocessing import Pool
    import time
    
    start = time.clock()
    
    def f(x):
        return x*x
    
    def testfunc(r):
        if __name__ == '__main__':
            print(True)
            with Pool(processes=7) as pool:     
                result = pool.map(f, range(r))
    
        return result
    
    result = testfunc(1000)
    print(time.clock() - start)
    


Answer: You are using `if __name__ == '__main__'` in wrong place.

    
    
    from multiprocessing import Pool
    import time
    
    start = time.clock()
    
    def f(x):
        return x*x
    
    def testfunc(r):
        print(True)
        with Pool(processes=7) as pool:     
            result = pool.map(f, range(r))
        return result
    
    if __name__ == '__main__':
        result = testfunc(1000)
        print(time.clock() - start)
    

According to [`multiprocessing - Programming
guidelines`](http://docs.python.org/3/library/multiprocessing.html#multiprocessing-
programming):

> _Safe importing of main module_
>
> Make sure that the main module can be safely imported by a new Python
> interpreter without causing unintended side effects (such a starting a new
> process).
>
> ... one should protect the “entry point” of the program by using if __name__
> == '__main__': as follows:

