之前博文:
协程异步 SSH登录网络设备 以思科设备举例
目标:
如果编程当中,有些python库不支持异步IO,那么我们可以结合多进程的方式来实现类似协程异步的效果。
实验环境:
1.网络设备用eve模拟思科的IOS设备 2.python3 3.使用的python库有: a.asyncio b.asyncssh c.sys d.time 4.win10运行代码 5.实验拓扑:
代码如下:
from netmiko import ConnectHandler import time import asyncio import concurrent.futures def ssh_device(config): net_connect = ConnectHandler(**config) run_config = net_connect.send_command('show run') print(run_config) async def main(host): loop = asyncio.get_running_loop() with concurrent.futures.ProcessPoolExecutor() as pool: result = await loop.run_in_executor(pool, ssh_device, host) print('custom process pool', result) if __name__ == '__main__': # 6台需要访问的主机列表 host_list = [ { 'device_type': 'cisco_ios', 'ip': '172.16.1.101', 'username': 'admin', 'password': 'admin', 'secret': 'admin', }, { 'device_type': 'cisco_ios', 'ip': '172.16.1.102', 'username': 'admin', 'password': 'admin', 'secret': 'admin', }, { 'device_type': 'cisco_ios', 'ip': '172.16.1.103', 'username': 'admin', 'password': 'admin', 'secret': 'admin', }, { 'device_type': 'cisco_ios', 'ip': '172.16.1.104', 'username': 'admin', 'password': 'admin', 'secret': 'admin', }, { 'device_type': 'cisco_ios', 'ip': '172.16.1.200', 'username': 'admin', 'password': 'admin', 'secret': 'admin', }, { 'device_type': 'cisco_ios', 'ip': '172.16.1.100', 'username': 'admin', 'password': 'admin', 'secret': 'admin', } ] # 记录开始时间 start_time = time.time() # 定义存放异步任务的列表 tasks = [] # 启动一个循环事件 loop = asyncio.get_event_loop() # 遍历需要配置的主机列表,创建任务对象 for conf in host_list: tasks.append(loop.create_task(main(conf))) # 等待所有的异步任务执行完毕 loop.run_until_complete(asyncio.wait(tasks)) # 记录程序执行结束时间 end_time = time.time() # 计算时间差 delta_time = end_time - start_time print(delta_time)
执行如下:
12s左右的耗时:
如果使用同步的方式要38s左右: