web-dev-qa-db-ja.com

Python Multiprocessing-kwargsを関数に渡す方法は?

Pythonのマルチプロセッシングで関数にディクショナリを渡すにはどうすればよいですか?ドキュメント: https://docs.python.org/3.4/library/multiprocessing.html#reference 辞書を渡すように言われていますが、私は取得し続けます

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

これがコードです:

from multiprocessing import Pool, 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)
11
Jim Factor

コードを実行すると、別のエラーが発生しました。

_TypeError: fp() takes at most 3 arguments (5 given)
_

Argsとkwargsを出力し、メソッドをfp(*args, **kwargs)に変更してデバッグしたところ、「bob_」が文字の配列として渡されていることに気付きました。 argsに使用されている括弧は機能しており、実際にはタプルを提供していないようです。リストに変更し、numListをキーワード引数として渡すと、コードが機能しました。

_from multiprocessing import Pool, 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)
_
16
Karin