如果使用的庫不支援非同步,可以使用多程式並將其轉化為非同步物件

Silkage發表於2021-04-26

  目標:

  登入後複製

  如果程式設計當中,有些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左右:

  如果使用的庫不支援非同步,可以使用多程式並將其轉化為非同步物件


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69999013/viewspace-2769819/,如需轉載,請註明出處,否則將追究法律責任。

相關文章