问题描述
我有一个简单的功能,可以收集几件网络设备中的卡片清单。我正在使用 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