如果使用的库不支持异步,可以使用多进程并将其转化为异步对象

  目标:

  登录后复制

  如果编程当中,有些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左右:

  如果使用的库不支持异步,可以使用多进程并将其转化为异步对象


请使用浏览器的分享功能分享到微信等