executor.map и параметры без терактов - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь преобразовать свой сценарий из потоков в более кульную многопроцессорную обработку (с python 3.2 и concurrent.futures, но этот фрагмент кода вылетает

        with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
            for result in executor.map(lambda h:
                                       validate_hostname(h, pci_ids, options.verbose),
                                       get_all_hostnames()):

Я получаю ошибку _pickle.PicklingError: Can't pickle <class 'function'>: attribute lookup builtins.function failed. При чтении этого ответа я думаю, что проблема в том, что невозможно получить лямбда-функцию в качестве параметра executor.map(), а для того, чтобы сделать executor.map(), мне нужно разработать однопараметрическую функцию но эти pci_ids и options.verbose являются переменными, поэтому я не могу указать их как фиксированные значения в справочной функции.

Есть идеи, что делать?

1 Ответ

6 голосов
/ 03 февраля 2012

Чтобы избежать ошибки рассола, вы должны определить функцию validate на верхнем уровне модуля или скрипта.

Поскольку функция передается в executor.map, она может принимать только один аргумент, поэтому пусть этот аргумент будет трехкратным, (h, pci_ids, verbose).

def validate(arg):
    h, pci_ids, verbose = arg
    return validate_hostname(h, pci_ids, verbose)

with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
    for result in executor.map(validate, [(host, pci_ids, options.verbose)
                                          for host in get_all_hostnames()]):
...