Многопроцессорность Python: пересылка kwargs в функцию актора

Примечание: Многопроцессорность Python — как передать kwargs для работы? не отвечает на этот вопрос.

procs.append(Process(target=fn, args=(cmd, results), kwargs=**kwargs))

Pycharm показывает синтаксическую ошибку expression expected в ** для kwargs=**kwargs.

Как мне передать kwargs без расширения?

Я пытался использовать kwargs=kwargs следующим образом

import multiprocessing
from multiprocessing import Process
import time


c = 0
def fn(a, res, **kwargs):
    print('sleeping: {}'.format(kwargs))
    time.sleep(10)
    global c
    c+=1
    res[a]=c
    print(res)

def test(**kwargs):
    cmds = ['1','2','3']
    procs = []
    manager = multiprocessing.Manager()
    results = manager.dict()
    for cmd in cmds:
        procs.append(Process(target=fn, args=(cmd, results), kwargs=kwargs))
        procs[-1].start()
    for proc in procs:
        proc.join()
    print(results)

if __name__ == '__main__':
    test(a=1, b=2)

Но получил ошибку:

self._target(*self._args, **self._kwargs)
TypeError: fn() got multiple values for argument 'a'
Process Process-3:

person overflower    schedule 03.12.2019    source источник


Ответы (1)


У вас есть имя переменной a в kwargs, поэтому параметр a в функции fn определен как в cmd, так и в kwargs. Попробуйте изменить параметр a в def fn(a, res, **kwargs): на другое имя или измените a в test(a=1, b=2) на что-то вроде test(e=1, b=2)

person ExplodingGayFish    schedule 03.12.2019