You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多线程执行时如何在首个线程完成后终止所有剩余线程

实现任意线程找到密码后立即终止整个程序的方案

方案1:暴力终止进程(实现成本最低)

Python 中常规的 exit()、sys.exit() 仅能终止当前运行的线程,无法结束整个进程。你可以直接调用操作系统级的进程终止接口,找到密码后直接杀掉整个程序进程,所有线程会同步停止。
修改步骤:

  1. 代码头部引入 os 模块:
import os
  1. 修改 breaker 函数中找到密码后的逻辑,新增进程终止语句:
print("\nThe Password is "+str(attempt)+" and it took "+str(attempts)+" attempts")
os._exit(0) # 直接终止整个程序进程

方案2:事件标志通知(更优雅,无资源泄漏风险)

使用线程安全的 threading.Event 作为全局停止信号,所有工作线程循环执行时优先检查停止信号,收到信号后主动退出,不会出现资源强制回收的问题。
修改步骤:

  1. 全局定义停止事件,在原有线程数定义后新增:
threadLength=10
stop_event = threading.Event() # 全局停止信号事件
  1. 修改 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
  1. 改写 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:54:02