使用 ThreadPool 执行器的结果使用函数中的参数创建多个文件

问题描述

我有一个简单的功能,可以收集几件网络设备中的卡片清单。我正在使用 executor.map 来调用函数生成结果。这一切正常。但是,我需要将结果写入不同的文件。理想情况下,我希望为我收集库存的每个节点都有一个文件名。所以像 node1-inventory.txt、node2-inventory.txt 等等。当我遍历结果并将它们写入文件时,我无法弄清楚如何在文件名中包含节点名称。我的输出将是 node1-inventory.txt、node2-inventory.txt 等等。

def get_node_inventory(node_name):
    with Ta5kTelnet() as tlnt:
        tlnt.login(node_name,'username','password')
        shelf_inventory = tlnt.send_command(b"show system inventory",b"#")
        return shelf_inventory

nodes = [node1,node2,node3]

with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(get_node_inventory,nodes)

    for result in results:
        with open(node-name + "-inventory.txt","w") as f:
            f.write(result)

解决方法

简单地返回一个包含节点名称和结果的元组,而不仅仅是结果。

def get_node_inventory(node_name):
    with Ta5kTelnet() as tlnt:
        tlnt.login(node_name,"username","password")
        shelf_inventory = tlnt.send_command(b"show system inventory",b"#")
        return (node_name,shelf_inventory)

with concurrent.futures.ThreadPoolExecutor() as executor:
    results = executor.map(get_node_inventory,[node1,node2,node3])

    for (node_name,result) in results:
        with open(node_name + "-inventory.txt","w") as f:
            f.write(result)

或者,您也可以写入工作线程中的不同文件。我在这里切换到 multiprocessing 以使用 imap_unordered,因为此任务不应该关心执行顺序。

from multiprocessing.pool import ThreadPool


def get_node_inventory(node_name):
    with Ta5kTelnet() as tlnt:
        tlnt.login(node_name,"password")
        return tlnt.send_command(b"show system inventory",b"#")


def write_node_inventory(node_name):
    inventory = get_node_inventory(node_name)
    with open(node_name + "-inventory.txt","w") as f:
        f.write(result)


with ThreadPool() as pool:
    for result in pool.imap_unordered(write_node_inventory,node3]):
        pass