在此代码中使用线程函数时,python中会发生什么

时间:2015-06-03 03:29:48

标签: python python-2.7

我的问题是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 个答案:

答案 0 :(得分:1)

使用多线程会降低此代码的效率。

这里的工作是面向CPU的。 Python线程在分配面向CPU的工作方面效果不佳,因为一次只能有一个线程工作(因为Python GIL或Global Intepreter Lock)!

Python线程对于阻止网络调用,磁盘读取等操作更有用。

除此之外,制作大量线程会增加大量开销,因为有一个线程调度程序不断切换正在运行的线程,以便没有线程匮乏。在您的示例中,为行中的每个文件创建了一个线程,如果超过30-50行,则非常糟糕。

回答你的问题:

  

python如何创建用于测试多个密码的线程?

它只是在文件中每一行的新线程中运行函数#include "HugeInteger.h" // include definiton of class HugeInteger using namespace std; int main() { HugeInteger A, B, C, D; // input value for A & B cout << "****** Test << & >> operators ******\n\n"; cout << "Input values for A and B: "; cin >> A >> B; cout << "\nA = " << A << "\nB = " << B; D = B; // test += operator cout << "\n\n****** Test += operator ******\n\n"; cout << "A = " << A << "\nB = " << B << "\nC = " << C << "\n\n"; cout << "C = B += A\n"; C = B += A; cout << "\nA = " << A << "\nB = " << B << "\nC = " << C; B = D; // restore B's value system("pause"); return 0; } // end main

  

为什么效率更高?

由于Python GIL的限制以及拥有超过20个线程的开销,这绝对比没有多线程运行整个文件更有效。