2017-04-24 27 views
-2

我對編碼/腳本編程有點新,並且需要一些幫助來實現多處理。使用python多處理器登錄路由器

我目前有兩個功能,我將集中在這裏。第一個,def getting_routes(router):登錄到我所有的路由器(路由器列表來自前一個功能)並運行命令。第二個函數def parse_paths(routes):解析這個命令的結果。

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路由器長,隨後沿解析,需要相當長的時間,所以我想用多模塊運行ssh方式連接到路由器,命令執行,並隨後在解析並行於所有路由器。 我寫道:

#!/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() 

我想什麼是平行ssh方式連接到路由器,運行命令,並返回解析輸出。我一直在閱讀http://kmdouglass.github.io/posts/learning-pythons-multiprocessing-module.html和多處理模塊,但我仍然沒有得到我需要的結果,並一直得到未定義的錯誤。對於我可能在多處理模塊中缺少的任何幫助?提前致謝!

回答

0

看起來像你沒有發送路由器參數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)