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

如何优化ThreadPoolExecutor多线程端口扫描器,提速并仅返回成功结果?

端口扫描器优化方案

原代码核心问题分析

  • 线程串行阻塞:原run函数中逐个调用future.result(),会等待每个线程执行完毕后才启动下一个,完全丧失多线程并行优势,导致耗时和单线程相差无几。
  • 重复IP处理:每个scan线程都重复执行IP清理与解析操作,浪费CPU资源。
  • 无效锁操作:scan函数内创建的lock是局部变量,每个线程持有独立锁,根本无法实现同步,反而增加额外开销。
  • 冗余结果收集:未开放端口的scan函数返回None,直接收集所有结果导致列表充斥无效值。
  • 宽泛异常捕获:except:捕获所有异常,不利于排查真实问题,还可能吞掉潜在错误。

优化后的完整代码

import socket
import concurrent.futures
import re

def scan(ip, port):
    # 使用with语句自动管理Socket生命周期,无需手动close
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as scanner:
        scanner.settimeout(0.2)  # 适度调整超时,平衡速度与探测准确性
        try:
            scanner.connect((ip, port))
            # 处理未知端口服务的情况
            service = socket.getservbyport(port) or "Unknown Service"
            result = f"Port {port} is OPEN Running {service}"
            print(result)
            return result
        except (socket.timeout, ConnectionRefusedError):
            # 只捕获扫描失败的常见异常,避免干扰有效结果
            return None
        except Exception as e:
            # 其他异常可按需记录,此处暂时忽略
            return None

def run(ip_num: str, nums_ports: int) -> list:
    # 提前统一处理IP,避免每个线程重复执行
    cleaned_ip = re.sub(r"(https?://|\\/)", '', ip_num.strip())
    try:
        target_ip = socket.gethostbyname(cleaned_ip)
    except socket.gaierror:
        print("Invalid target address")
        return []
    
    open_ports = []
    # 调整线程数(可根据机器性能调整,建议200-500)
    with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:
        # 使用map批量提交任务,自动实现并行调度
        results = executor.map(scan, [target_ip]*nums_ports, range(1, nums_ports+1))
        # 过滤None值,仅保留开放端口的有效结果
        open_ports = [res for res in results if res is not None]
    
    print("\nFinal Open Ports Summary:")
    for res in open_ports:
        print(res)
    return open_ports

def main():
    ip = input("target> ")
    run(ip, 1025)

if __name__ == "__main__":
    main()

关键优化点说明

  1. 并行任务调度:用executor.map替代逐个submit+result,自动实现多线程并行执行,大幅提升扫描速度。
  2. IP预处理:在run函数中一次性完成IP清理与解析,避免重复操作浪费资源。
  3. 结果过滤:通过列表推导式直接剔除None值,仅保留开放端口的有效信息。
  4. Socket资源管理:用with语句自动处理Socket的创建与关闭,避免资源泄漏。
  5. 精准异常捕获:只捕获超时、连接拒绝等扫描失败的常见异常,既排除无效端口干扰,又不吞掉其他潜在错误。
  6. 参数调优:调整线程数至300(可根据机器性能灵活调整),超时时间设为0.2秒,平衡扫描效率与结果准确性。

内容的提问来源于stack exchange,提问作者AbdullahSaidAbdeaaziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:01:03