平常编写多线程爆破工具时,线程找到正确的帐户密码时会导出结果,并直接通过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: https://blog.csdn.net/qq_41901915/article/details/82703429
#在这里我们模仿一个红绿灯的应用场景,绿灯亮的时候,车可以通过,红灯亮的时候要等待。
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()
结果:
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
红灯[奔驰] 正在等待
红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
绿灯[奔驰] 正在开过
红灯[奔驰] 正在等待
红灯
红灯
红灯
绿灯
[奔驰] 正在开过
绿灯[奔驰] 正在开过
[奔驰] 正在开过绿灯
[奔驰] 正在开过绿灯
[奔驰] 正在开过绿灯
[奔驰] 正在开过绿灯
[奔驰] 正在开过红灯