Вызов python многопроцессорной функции карты со словарем - PullRequest
0 голосов
/ 07 февраля 2020

Я могу сделать следующее с помощью imap:

import multiprocessing

def function(a):
    return a**2

b = [1,2,3,4,5,6,7,8,9,10]

pool = multiprocessing.Pool(processes=4)
vals = pool.imap(function, b)

for i in vals:
    print(i)

Однако, если я хочу передать слово, это можно сделать:

import multiprocessing

def function(name, a):
    print("{}'s number squared:".format(name))
    return a**2

b = dict(bob=1, dave=2, stan=3)

pool = multiprocessing.Pool(processes=4)
vals = pool.imap(function, b)

for i in vals:
    print(i)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Вы можете передать словарь, но операция map над словарем обеспечивает только словарь keys . Если вы хотите, чтобы элементы в словаре, использовали dict.items, что-то вроде:

import multiprocessing
def function(item):
    name, a = item
    print("{}'s number squared:".format(name))
    return a**2

if __name__ == '__main__': # you must guard your multiprocessing calls!

    b = dict(bob=1, dave=2, stan=3)

    with multiprocessing.Pool(processes=4) as pool:
        vals = pool.imap(function, list(b.items()))

        for i in vals:
            print(i)

Или вы можете использовать imap, если хотите, чтобы эта же сигнатура функции работала:

import multiprocessing
def function(name, a):
    print("{}'s number squared:".format(name))
    return a**2

if __name__ == '__main__': # you must guard your multiprocessing calls!

    b = dict(bob=1, dave=2, stan=3)

    with multiprocessing.Pool(processes=4) as pool:
        vals = pool.starmap(function, list(b.items()))

    for i in vals:
        print(i)

Другой подход состоит в том, чтобы использовать глобальную переменную и передать dict напрямую pool.map, хотя это может быть немного уродливо:

import multiprocessing
def function(name):
    a = b[name]
    print("{}'s number squared:".format(name))
    return a**2

b = dict(bob=1, dave=2, stan=3)

if __name__ == '__main__': # you must guard your multiprocessing calls!


    with multiprocessing.Pool(processes=4) as pool:
        vals = pool.imap(function, b)

        for i in vals:
            print(i)

Обратите внимание, я использовал muliprocessing.Pool как менеджер контекста, поэтому при выходе из блока with пул гарантированно будет закрыт независимо от того, что произойдет. Это лучшая практика.

0 голосов
/ 07 февраля 2020

Вы не можете передать словарь, но вы можете передать список словарей, например:

import multiprocessing

def function(input_dictionary):
    print("{}'s number squared:".format(input_dictionary['name']))
    return input_dictionary['number']**2

b = [ {'name' : 'bob', 'number' : 1},
      {'name' : 'dave', 'number' : 2},
      {'name' : 'stan', 'number' : 3}, ]


pool = multiprocessing.Pool(processes=4)
vals = pool.imap(function, b)

for i in vals:
    print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...