Как я могу переписать код для многопользовательского - PullRequest
0 голосов
/ 07 января 2020

Я хотел бы сделать многопоточность для моего кода, но понятия не имею, с чего начать .... В основном, сценарий python будет выполнять "для" l oop на многих устройствах (определенных в другом файл "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

Ответы [ 2 ]

4 голосов
/ 07 января 2020

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)

EDITED: если вы хотите использовать Threadpool:

from multiprocessing.pool import ThreadPool
2 голосов
/ 07 января 2020

Книга 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()
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 - и пока не ясно, разрешены ли они на данный момент.

Надеюсь, это поможет (также можно обновить этот ответ, если у кого-то есть другие решения ).

...