二、实验说明

2.1 导入Python内置模块threading来实现多线程

2.2 定义一个ssh_session(ip,output_q)函数,包含ip和output_q两个参数,分别用来表示登录设备的IP地址以及表示先进先出队列

2.3 配合for循环语句使用threading的Thread()函数为ssh_session(ip,output_q)函数创建多个线程并将其赋值给变量t

2.4 调用threading的start()启动刚刚创建的线程

2.5 配合for循环语句对每个线程调用join()方法,确保所有线程执行结束

2.6 所有线程执行结束后执行内核线程的print()语句

三、实验脚本

#设置编码格式支持utf-8
#coding=utf-8
#通过import语句引入threading模块、内置队列模块queue中Queue类、time模块、netmiko库中的ConnectHandler方法
import threading 
from  queue import Queue 
import time 
from netmiko import ConnectHandler 

#打开名为ip_list.txt的文件并将其赋值给变量f
f = open('ip_list.txt')
#创建一个名为threads的空列表,方便储存线程
threads = []

#定义一个名为ssh_session(ip,output_q)的函数
def ssh_session(ip,output_q):
#定义一个包含命令的列表commands
    commands = ['int loop 0','ip address 1.1.1.1 24']
#创建一个名为SW的字典,其中包含着设备类型、设备登录IP、登录用户名、登录密码
    SW = {
    'device_type':'huawei',
    'ip':'ip',
    'username':'python',
    'password':'123'}
#调用netmiko库里的方法ConnectHandler()登录设备
    connect = ConnectHandler(**SW)
#执行列表commands中的一系列的命令并将回显内容赋值给output,将其打印出来
    output = connect.send_config_set(commands)
    print(output)   

#打印程序开始时间
print(f"程序于{time.strftime('%X')} 开始执行\n")

#将读取到的IP地址一一赋值给ips
for ips in f.readlines():
#使用threading中的Thread()函数为ssh_session(ip,output_q)函数创建一个线程并将其赋值给变量t,其中target参数对应的是函数名称ssh_session,args对应的是去除空白行的IP地址,这里应用queue模块中Queue类---先进先出队列并将它作为参数配置给output_q
    t = threading.Thread(target=ssh_session,args=(ips.strip(),Queue()))
#调用threading中的start()来启动刚刚创建的线程
    t.start()
#将线程一一添加到列表threads中
    threads.append(t)

#针对每个线程,调用join()方法强制阻塞调用它的线程,直到当前线程运行完毕或者终止
for i in threads:
    i.join()

#打印程序执行结束时间
print(f"\n程序于{time.strftime('%X')} 执行结束")

四、实验环境

4.1 操作环境:Linux环境

4.2 Python版本:3.8

五、实验步骤

5.1 使用'vi netmiko_thread.py'创建脚本文件,并将其上述脚本内容复制粘贴

图一

5.2 使用'chmod +x netmiko_thread.py'给脚本文件添加可执行权限

5.3 使用'vi ip_list.txt'创建包含IP地址的文本文件

图三

5.4 使用'python3.8 netmiko_thread.py'执行脚本文件

图二