Pass multiple parameters to concurrent.futures.Executor.map?

后端 未结 6 697
梦毁少年i
梦毁少年i 2020-12-07 17:27

The concurrent.futures.Executor.map takes a variable number of iterables from which the function given is called. How should I call it if I have a generator that pro

6条回答
  •  醉梦人生
    2020-12-07 18:08

    So suppose you have a function with takes 3 arguments and all the 3 arguments are dynamic and keep on changing with every call. For example:

    def multiply(a,b,c):
        print(a * b * c)
    

    To call this multiple times using threading, I would first create a list of tuples where each tuple is a version of a,b,c:

    arguments = [(1,2,3), (4,5,6), (7,8,9), ....]
    

    To we know that concurrent.futures's map function would accept first argument as the target function and second argument as the list of arguments for each version of the function that will be execute. Therefore, you might make a call like this:

    for _ in executor.map(multiply, arguments) # Error
    

    But this will give you error that the function expected 3 arguments but got only 1. To solve this problem, we create a helper function:

    def helper(numbers):
        multiply(numbers[0], numbers[1], numbers[2])
    

    Now, we can call this function using executor as follow:

    with ThreadPoolExecutor() as executor:
         for _ in executor.map(helper, arguments):
             pass
    

    That should give you the desired results.

提交回复
热议问题