0

我想对我的代码进行多线程处理,但不知道如何开始......基本上python脚本将执行一个“for”循环到很多设备(在另一个文件“pyntc_devices_list”中定义),以备份配置所有设备。

使用多线程,我应该同时运行备份到所有设备,而不是一个接一个。非常感谢您的帮助。

我的代码如下:

from pyntc import ntc_device as NTC
from pyntc_devices_list import Get_Devices_List

all_devices = Get_Devices_List()

for device in all_devices:
    print('Backing up ' + device['name'])
    try:
        DEVICE = NTC(host=device['ip'], username=device['username'], password=device['password'], device_type='cisco_ios$
        DEVICE.open()
    except Exception as unknown_error:
        print('Error: ' + str(unknown_error))
        continue

    back_config = DEVICE.backup_running_config(device['name'] + '.cfg')
    DEVICE.close()

“pyntc_devices_list”的一部分

ESW1 = {
    'name': 'ESW1',
    'ip': '192.168.122.72',
    'username': 'yyc',
    'password': 'cisco',
 }

 ESW2 = {
    'name': 'ESW2',
    'ip': '192.168.122.73',
    'username': 'yyc',
    'password': 'cisco',
 }

 ESW3 = {
    'name': 'ESW3',
    'ip': '192.168.122.74',
    'username': 'yyc',
    'password': 'cisco',
 }

 def Get_Devices_List():
    all_devices = [ESW1, ESW2, ESW3]
    return all_devices
4

2 回答 2

4

Python 的 Pool 类带有一个简单的 map 函数,它获取 todo 函数和可迭代对象,请尝试以下操作:

from multiprocessing import Pool
from pyntc import ntc_device as NTC
from pyntc_devices_list import Get_Devices_List

NUM_OF_PROCESSORS = 5

all_devices = Get_Devices_List()

def backup(device):
    print('Backing up ' + device['name'])
    DEVICE = NTC(host=device['ip'], username=device['username'], password=device['password'], device_type='cisco_ios$
    DEVICE.open()
    back_config = DEVICE.backup_running_config(device['name'] + '.cfg')
    DEVICE.close()


with Pool(NUM_OF_PROCESSORS) as p:
    p.map(backup, all_devices)

编辑:如果你想要线程池使用:

from multiprocessing.pool import ThreadPool
于 2020-01-07T06:07:23.923 回答
2

我与之无关的书https://scaling-python.com为 python 3.x 中的多线程(实际上是多处理)提供了一些很好的解决方案。以下是一些多线程选项(但我主要是让有兴趣的读者参考这本书,代码摘自其中):

  1. 线程模块(示例 2.1、2.2、2.3):
import threading
t = threading.Thread(target=my_func,args=(...,))
t.start()
t.join()
  1. concurrent.futures(示例 2.7、2.8):
from concurrent import futures
with futures.ThreadPoolExecutor as executor:
    futures = [executor.submit(my_func) for _ in range(...)]
results = [f.result() for f in futures]

书中还有很多其他的路线。在与 gunicorn/uwsgi Flask 工作人员一起使用期货时,我确实遇到了一些问题——目前尚不清楚这些问题是否可以解决。

希望有所帮助(如果有人有任何其他解决方案,也可以更新此答案)。

于 2020-01-07T06:49:10.087 回答