Многопроцессорная звездная карта возвращает список вместо словаря

#python #multiprocessing

Вопрос:

Я запускаю функцию, которая предназначена для возврата переменной словаря через звездные карты с несколькими входами. Однако, когда я печатаю конечный результат, полученный в результате многопроцессорной обработки, вместо этого я получаю переменную типа списка. Почему это происходит и есть ли обходной путь? Спасибо.

Пример:

 from multiprocessing import Pool

def return_dict(keys, values):
    dict =dict(zip(keys, values))
    print(type(dict))
    return dict

with Pool(3) as p:
    output = p.starmap(return_dict, [(['name', 'age', 'nationality'], ['Bob', 17, 'Korean']),
                                     (['price', 'fruit', 'drink'], [20, 'banana', 'juice']),
                                     (['color1', 'color2', 'color3'], ['red', 'blue', 'green']))
print(type(output))
 

Выход:

 <class 'dict'>
<class 'dict'>
<class 'dict'>
<class 'list'>
 

Комментарии:

1. можете ли вы подробнее описать ожидаемый результат?

2. надеясь, что это будет переменная словаря, а не переменная списка

3. Распечатайте output себя — это, скорее всего, список этих словарей

4. В этом-то и была проблема, спасибо! Просто нужно просмотреть список, чтобы получить словари

Ответ №1:

Вы можете получить желаемый результат следующим образом. Также я советую выполнять такие простые операции в одном процессе и не использовать Pool

 from multiprocessing import Pool


def return_dict(keys, values):
    # use dictionary comprehension to create dictionary
    _dict = {keys[i]: values[i] for i in range(len(keys))}
    print(type(_dict))
    return _dict


if __name__ == '__main__':

    data = [
        (
            ['name', 'age', 'nationality'],
            ['Bob', 17, 'Korean'],
        ),
        (
            ['price', 'fruit', 'drink'],
            [20, 'banana', 'juice'],
        ),
        (
            ['color1', 'color2', 'color3'],
            ['red', 'blue', 'green'],
        )
    ]

    with Pool(3) as p:
        output = p.starmap(return_dict, data)

    for j in output:
        print(j)
 

Комментарии:

1. Спасибо, это был всего лишь упрощенный пример