Использование многопроцессорной обработки Python для входа в маршрутизаторы

Я немного новичок в программировании и написании сценариев в целом, и мне нужна помощь в реализации многопроцессорности.

В настоящее время у меня есть две функции, на которых я сосредоточусь здесь. Первый, def getting_routes(router):регистрируется во всех моих маршрутизаторах (список маршрутизаторов взят из предыдущей функции) и запускает команду. Вторая функция def parse_paths(маршруты): анализирует результаты этой команды.

def get_list_of_routers 
<some code> 
    return routers

def getting_routes(router):
    routes = sh.ssh(router, "show ip route")
    return routes

def parse_paths(routes):
    l = routes.split("\n")
...... <more code>.....
return parsed_list

Мой список имеет длину около 50 маршрутизаторов и вместе с последующим синтаксическим анализом занимает довольно много времени, поэтому я хотел бы использовать многопроцессорный модуль для запуска sshing на маршрутизаторах, выполнения команд и последующего синтаксического анализа на всех маршрутизаторах. Я написал:

#!/usr/bin/env python
import multiprocessing.dummy import Pool as ThreadPool
def get_list_of_routers  (***this part does not need to be threaded)
<some code> 
    return routers

def getting_routes(router):
    routes = sh.ssh(router, "show ip route")
    return routes

def parse_paths(routes):
    l = routes.split("\n")
...... <more code>.....
    return parsed_list

if __name__ == '__main__':
    worker_1 = multiprocessing.Process(target=getting_routes)
    worker_2 = multiprocessing.Process(target=parse_paths)


   worker_1.start()
   worker_2.start()

То, что я хотел бы для параллельного sshing в маршрутизатор, выполнения команды и возвращения проанализированного вывода. Я читал http://kmdouglass.github.io/posts/learning-pythons-multiprocessing-module.html и модуль многопроцессорной обработки, но все еще не получаю нужных мне результатов и продолжаю получать неопределенные ошибки. Любая помощь с тем, что я мог бы пропустить в многопроцессорном модуле? Заранее спасибо!

1 ответ

Похоже, вы не отправляете параметр маршрутизатора в функцию getting_routes.

Кроме того, я думаю, что использование потоков будет достаточно, вам не нужно создавать новые процессы.

Что вам нужно сделать, это создать цикл в главном блоке, который будет запускать новый поток для каждого маршрутизатора, который возвращается из функции get_list_of_routers. Затем у вас есть два варианта - либо вызвать функцию parse_paths из потока, либо получить результаты возврата из потоков, а затем вызвать parse_paths.

Например: импортировать очередь из потоков

que = Queue.Queue()
threads = []


for router in get_list_of_routers():
    t = Thread(target=lambda q, arg1: q.put(getting_routers(arg1)), args=(que, router))
    t.start()
    threads.append(t)


for t in threads:
    t.join()


results = []
while not que.empty():
    results.append(que.get())


parse_paths(results)
Другие вопросы по тегам