Использование многопроцессорной обработки 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)