Search code examples
pythonmultiprocessingconstantspool

Python multiprocessing's Pool constants


I'm beginner with the multiprocessing module in python and I want to use concurrent execution ONLY for my def func. Moreover I'm using some constants in my code and I have problem with them. The code is (python 3.6.8):

from multiprocessing import Pool

FIRST_COUNT=10
print("Enter your path")
PATH=input()

some_list=[]
for i in range(10000):
    some_list.append(i)  


def func(some_list):
    .....


if __name__ == "__main__":
chunks = [some_list[i::4] for i in range(4)]
pool = Pool(processes=4)

pool.map(func,chunks)

When I try to start this programm, I see the message Enter your path 5 times and 5 times I need to input my path. i.e this code execute 1 + 4(for each processes) times.

I want to use FIRST_COUNT, PATH and some_list like a constants, and use multiprocesseing only for func. How can i do this. Please, help me.


Solution

  • You should put code inside if __name__ == "__main__": to execute it only once

    if __name__ == "__main__":
        FIRST_COUNT = 10
        PATH = input("Enter your path: ")
    
        some_list = list(range(10000))
        #some_list = []
        #for i in range(10000):
        #    some_list.append(i)  
    
        chunks = [some_list[i::4] for i in range(4)]
        pool = Pool(processes=4)
    
        results = pool.map(func, chunks)
    
        print(results)
    

    If you want to use FIRST_COUNT, PATH then better send it to func as arguments.

    You will have to create tuples with FIRST_COUNT, PATH in chunks

    chunks = [(FIRST_COUNT, PATH, some_list[i::4]) for i in range(4)]
    

    and function will have to get it as tuple and unpack it

    def func(args):
        first_count, paht, some_list = args
    

    Working example

    from multiprocessing import Pool
    
    def func(args):
        first_count, path, some_list = args
    
        result = sum(some_list)
    
        print(first_count, path, result)
    
        return result 
    
    
    if __name__ == "__main__":
        FIRST_COUNT = 10
        PATH = input("Enter your path: ")
    
        some_list = list(range(10000))
        #some_list = []
        #for i in range(10000):
        #    some_list.append(i)  
    
        chunks = [(FIRST_COUNT, PATH, some_list[i::4]) for i in range(4)]
        pool = Pool(processes=4)
    
        all_results = pool.map(func, chunks)
    
        print('all results:', all_results)
    

    EDIT: You can also use starmap() instead of map()

        all_results = pool.starmap(func, chunks)
    

    and then you can use (without unpacking arguments)

    def func(first_count, path, some_list):