2015-06-03 44 views
0

我的問題是python如何創建多個密碼測試的線程?爲什麼它更有效率?在這段代碼中使用線程函數時,python會發生什麼

import zipfile 
from threading import Thread 

def extractFile(zFile, password): 
    try: 
     zFile.extractall(pwd=password) 
     print '[+] Found password ' + password + '\n' 
    except: 
     pass 

def main(): 
    zFile = zipfile.ZipFile('evil.zip') 
    passFile = open('dictionary.txt') 
    for line in passFile.readlines(): 
     password = line.strip('\n') 
     t = Thread(target=extractFile, args=(zFile, password)) 
     t.start() 

if __name__ == '__main__': 
    main()` 

回答

1

多線程的使用使得代碼效率降低。

這裏正在進行的工作是面向CPU的。 Python線程在分發面向CPU的工作時效果不佳,因爲一次只能有一個線程工作(因爲Python GIL或Global Intepreter Lock)!

Python的線程是阻塞操作,比如網絡電話更加有用,磁盤讀取等

在此之上,使得大量線程的開銷增加了很多,因爲有一個線程調度器不斷切換哪個線程正在運行,以避免線程餓死。在你的例子中,有一個的線程爲中的每個文件創建,如果超過30-50行,這是非常糟糕的。

要回答你的問題:

Python是怎樣創建線程多個密碼的測試?

它只是在文件中每行的新線程中運行函數extractFile

爲什麼它更高效?

由於Python的GIL的限制,有超過20個線程的開銷,這絕對是不超過通過無多線程整個文件運行效率。

相關問題