Многопроцессорность Python — как передать kwargs для работы?

Как передать словарь функции с многопроцессорной обработкой Python? Документация: https://docs.python.org/3.4/library/multiprocessing.html#reference предлагает передать словарь, но я продолжаю получать

TypeError: fp() got multiple values for argument 'what'

Вот код:

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)

person Jim Factor    schedule 12.08.2016    source источник
comment
Я считаю, что этот поток будет помогите ответить на ваш вопрос.   -  person Nathan Marx    schedule 12.08.2016
comment
Также здесь: stackoverflow.com/questions/34031681 /   -  person Brian Larsen    schedule 04.08.2017


Ответы (1)


Когда я запустил ваш код, я получил другую ошибку:

TypeError: fp() takes at most 3 arguments (5 given)

Я провел отладку, напечатав args и kwargs и изменив метод на fp(*args, **kwargs), и заметил, что bob_ передается как массив букв. Кажется, что скобки, используемые для args, были рабочими и фактически не давали вам кортеж. Изменение его в списке, а затем также передача numList в качестве аргумента ключевого слова заставили код работать для меня.

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)
person Karin    schedule 12.08.2016
comment
Спасибо! Я не думал, что это возможно, и в итоге закодировал это по-другому. Но я буду использовать это в будущем! Также добавление запятой после 'bob'+str(i) превращает список в список 'bob'+str(i), - person Jim Factor; 12.08.2016