平常编写多线程爆破工具时,线程找到正确的帐户密码时会导出结果,并直接通过os._exit(0)进行脚本退出

 

自己在编写FTP多线程爆破时,发现多线程进行FTP爆破时候,线程中无法通过os._exit(0)进行脚本正常的退出,只是那个爆破出正确帐户密码的线程会退出,其他的线程还是一直在爆破。

 

网上找了很多关于多线程退出的资料,发现写的比较多也有点乱。

 

后来发现了一个不错的方法,想记录下,也希望对你们也有所帮助。

 

主要是通过threading的event来进行对线程的控制

 

event是python中一个特有的标志位方法,他一共有三种方法

1.event.wait():如果标志位设定了,它不做任何事,如果没有设定,则将会锁住,等待标志位的设定

2.event.set():设置标志位

3.event.clear():清除标志位

 

我们可以通过对event的设置和清除,并让子线程根据event的状态来执行相应的操作即可完成对线程的控制

以下代码和结果来自  IDEA_TEYU_1112

#在这里我们模仿一个红绿灯的应用场景,绿灯亮的时候,车可以通过,红灯亮的时候要等待。
import time
import threading
 
event = threading.Event()#首先要获取一个event对象
 
def lighter():
    count = 0
    event.set() #先设置绿灯
    while True:
        if count >5 and count < 10: #改成红灯
            event.clear() #把标志位清了
            print("红灯")
        elif count >10:
            event.set() #变绿灯
            count = 0
        else:
            print("绿灯")
        time.sleep(1)
        count +=1
 
def car(name):
    while True:
        if event.is_set(): #代表绿灯
            print("[%s] 正在开过"% name )
            time.sleep(1)
        else:
            print("[%s] 正在等待" %name)
            event.wait()#车的这个线程就锁在这里不动了,一直到set的时候,才会继续执行car的这个线程
 
 
light = threading.Thread(target=lighter,)
light.start()
 
car1 = threading.Thread(target=car,args=("奔驰",))
car1.start()
结果:

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

红灯[奔驰] 正在等待

红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

绿灯[奔驰] 正在开过

红灯[奔驰] 正在等待

红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过绿灯

[奔驰] 正在开过红灯