How do I pass a dictionary to a function with Python's Multiprocessing? The Documentation: https://docs.python.org/3.4/library/multiprocessing.html#reference says to pass a dictionary, but I keep getting
TypeError: fp() got multiple values for argument 'what'
Here's the code:
from multiprocessing import Process, Manager
def fp(name, numList=None, what='no'):
print ('hello %s %s'% (name, what))
numList.append(name+'44')
if __name__ == '__main__':
manager = Manager()
numList = manager.list()
for i in range(10):
keywords = {'what':'yes'}
p = Process(target=fp, args=('bob'+str(i)), kwargs={'what':'yes'})
p.start()
print("Start done")
p.join()
print("Join done")
print (numList)
Use the Python **kwargs parameter to allow the function to accept a variable number of keyword arguments. Inside the function, the kwargs argument is a dictionary that contains all keyword arguments as its name-value pairs. Precede double stars ( ** ) to a dictionary argument to pass it to **kwargs parameter.
Passing Keyword Arguments to Multiprocessing Processes We can also pass in arguments corresponding to the parameter name using the kwargs parameter in the Process class. Instead of passing a tuple, we pass a dictionary to kwargs where we specify the argument name and the variable being passed in as that argument.
Python 3.5+ allows passing multiple sets of keyword arguments ("kwargs") to a function within a single call, using the `"**"` syntax.
“ kwargs ” stands for keyword arguments. It is used for passing advanced data objects like dictionaries to a function because in such functions one doesn't have a clue about the number of arguments, hence data passed is be dealt properly by adding “**” to the passing type.
When I ran your code, I got a different error:
TypeError: fp() takes at most 3 arguments (5 given)
I debugged by printing args and kwargs and changing the method to fp(*args, **kwargs)
and noticed that "bob_" was being passed in as an array of letters. It seems that the parentheses used for args
were operational and not actually giving you a tuple. Changing it to the list, then also passing in numList
as a keyword argument, made the code work for me.
from multiprocessing import Process, Manager
def fp(name, numList=None, what='no'):
print ('hello %s %s' % (name, what))
numList.append(name+'44')
if __name__ == '__main__':
manager = Manager()
numList = manager.list()
for i in range(10):
keywords = {'what': 'yes', 'numList': numList}
p = Process(target=fp, args=['bob'+str(i)], kwargs=keywords)
p.start()
print("Start done")
p.join()
print("Join done")
print (numList)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With