Python多线程执行时如何在首个线程完成后终止所有剩余线程
实现任意线程找到密码后立即终止整个程序的方案
方案1:暴力终止进程(实现成本最低)
Python 中常规的 exit()、sys.exit() 仅能终止当前运行的线程,无法结束整个进程。你可以直接调用操作系统级的进程终止接口,找到密码后直接杀掉整个程序进程,所有线程会同步停止。
修改步骤:
- 代码头部引入 os 模块:
import os
- 修改
breaker函数中找到密码后的逻辑,新增进程终止语句:
print("\nThe Password is "+str(attempt)+" and it took "+str(attempts)+" attempts") os._exit(0) # 直接终止整个程序进程
方案2:事件标志通知(更优雅,无资源泄漏风险)
使用线程安全的 threading.Event 作为全局停止信号,所有工作线程循环执行时优先检查停止信号,收到信号后主动退出,不会出现资源强制回收的问题。
修改步骤:
- 全局定义停止事件,在原有线程数定义后新增:
threadLength=10 stop_event = threading.Event() # 全局停止信号事件
- 修改
createThreads函数,将停止事件传入每个工作线程:
def createThreads(passType, passLength, url, username, userData, passData): for i in range(threadLength): t = threading.Thread(target=breaker, args=[passType, passLength, url, username, userData, passData, stop_event]) threads.append(t) return threads
- 改写
breaker函数逻辑,循环前检查停止信号,找到密码后先触发停止信号通知所有线程退出:
def breaker(passType, passLength, url, username, userData, passData, stop_event): remAttempts=[] sesh=requests.session() attempts=0 print() # 循环条件改为未收到停止信号时执行 while not stop_event.is_set(): attempt = 'tes'+''.join(random.choice(passType)for i in range(passLength)) if attempt in remAttempts: continue remAttempts.append(attempt) request = sesh.post(url, data={ ''.join(userData):username, ''.join(passData):attempt }) print('<-------'+attempt+'------->') logAuth=request.cookies if logAuth: stop_event.set() # 触发停止信号,所有线程会陆续退出 print(f"\n密码是 {attempt},共尝试了 {attempts} 次") return attempts += 1
原有 bruteForce 中的线程启动、等待逻辑不需要修改,所有线程收到停止信号后会自然退出,主线程等待所有子线程结束后再退出即可。
内容的提问来源于stack exchange,提问作者BigFattyJuicySteamyMan
相关产品推荐
相关产品推荐

