以前博文:
協程異步 SSH登陸網絡設備 以思科設備舉例css
目標:python
若是編程當中,有些python庫不支持異步IO,那麼咱們能夠結合多進程的方式來實現相似協程異步的效果。
實驗環境:ios
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左右:
app