2011-07-26 72 views
2

爲了檢查許多服務器上的某個文件的存在,我創建了一個線程類,使用paramiko執行遠程命令使用ssh。每個線程的結果都被插入到線程安全Queue.Queue中,並且在所有join()完成後我讀取它的內容。這是線程的主要部分:Python的paramiko與線程,奇怪的延遲

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.connect(self.server, username='linqmap', timeout=5) 
stdin, stdout, stderr = client.exec_command('my_command') 

此解決方案很好,但有一個奇怪的行爲,引起了我的注意。線程記錄其__init__時間:

def __init__(self, server, queue, lock): 
    ... 
    self.start_time=datetime.datetime.now() 
    ... 

而且其結束時間(其中結果被插入到隊列中的時間):

def _report(self, message, status): 
    duration=datetime.datetime.now()-self.start_time 
    ... 
    self.queue.put((self.server, duration, message, status)) 

的問題是,持續時間爲所有的非常相似線程。對於少數(〜5)線程,大約需要3秒鐘。對於更大的數字(~100),大約是30秒。

由於在連接中有5秒的超時時間,我推測所有線程將在5秒內完成或失敗。有什麼想法發生在這裏?

回答

3

timeout僅用於TCP連接,而不是連接上的全部操作。

我期望在原始線程上調用__init__ - 只有run()方法在新線程上運行。所以你的時間可能是無效的。

SSH涉及隧道加密和設置的一定數量的處理,因此可能值得查看客戶端上的CPU使用情況,以查看這是否是對100個連接的限制因素。

+0

謝謝!令人驚訝的是,這確實是一個CPU負載問題..我將使用線程池。 –