3

我正在尝试将我的脚本从使用线程转换为更酷的多处理(使用 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。阅读此答案时,我认为问题在于不可能将 lambda 函数作为参数,executor.map()并且为了使executor.map()我需要开发一个单参数函数,但是这些pci_idsoptions.verbose是可变的,因此我无法将它们指定为固定帮助函数中的值。

有什么想法该怎么做?

4

1 回答 1

7

为避免 pickle 错误,您必须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()]):
于 2012-02-02T23:30:00.790 回答