Python 多线程 DNS 搜索性能优化

Python中的多线程经常用于IO密集型任务,如网络请求,其中DNS查询是常见的一种场景。由于全局解释器锁(GIL)的存在,Python的多线程并不适合计算密集型任务,但对于IO密集型任务,如DNS查询,多线程可以显著提高性能。那么如果遇到下面的问题,可以通过这样的解决方法解决。

在这里插入图片描述

1、问题背景

原有 Python DNS 搜索代码在扫描大范围 IP 地址时速度较慢,需要进行优化以提高性能。同时,使用多线程会导致写入文件时出现问题,需要找到一种方法来解决这个问题。

2、解决方案

  1. 优化 DNS 查询过程
  • 优化 DNS 查询包的生成和发送过程,减少不必要的操作。
  • 调整超时时间以减少等待时间。
  1. 优化多线程处理
  • 使用线程池来管理线程,提高线程利用率。
  • 使用锁来控制对文件写入的访问,避免多线程写入冲突。
  1. 使用异步 I/O
  • 将文件写入操作改为异步 I/O,以提高 I/O 性能。
  1. 代码示例
import socket
import struct
import threading
import os
import sys
import time
import asyncio# 基本 DNS 头部结构,用于 1 个查询
def build_dns_query(host):packet = struct.pack("!HHHHHH", 0x0001, 0x0100, 1, 0, 0, 0)for name in host:query = struct.pack("!b" + str(len(name)) + "s", len(name), name)packet = packet + querypacket = packet + struct.pack("!bHH", 0, 1, 1)return packet# 测试查询,用于 www.google.com
TEST_QUERY = build_dns_query(["www", "google", "com"])
DNS_PORT = 53
TIMEOUT = 2# 扫描服务器的 DNS
async def scan_dns(addr, timeout):reader, writer = await asyncio.open_connection(addr, DNS_PORT)# 发送 DNS 查询请求send_count = writer.write(TEST_QUERY)if send_count <= 0:return False# 等待响应try:data = await reader.read(1024)except asyncio.TimeoutError:return Falsereturn True# 将 IP 地址解析为整型元组
def extract_ip(ip):partip = ip.split(".")if len(partip) != 4:print("Invalid IP address:", ip)try:ip_tuple = (int(partip[0]), int(partip[1]), int(partip[2]), int(partip[3]))except ValueError:print("Invalid IP address:", ip)return ip_tuple# 主函数
async def main(start_ip, end_ip):# 存储找到的 DNS 服务器found_dns = []# 扫描所有 IP 地址for i0 in range(start_ip[0], end_ip[0] + 1):for i1 in range(start_ip[1], end_ip[1] + 1):for i2 in range(start_ip[2], end_ip[2] + 1):for i3 in range(start_ip[3], end_ip[3] + 1):# 构建 IP 地址ip_addr = f"{i0}.{i1}.{i2}.{i3}"print(f"Scanning {ip_addr}...", end=" ")# 扫描地址ret = await scan_dns(ip_addr, TIMEOUT)if ret:found_dns.append(ip_addr)print("Found!")await write_file(ip_addr)else:print("")print("Found DNS servers:", found_dns)# 写入文件
async def write_file(ip_addr):file = open("dns_servers.txt", "a")file.write(ip_addr + "\n")file.close()if __name__ == "__main__":if len(sys.argv) < 3:print("Usage: python dnsfind.py <start_ip> <end_ip>")exit()# 转换 IP 地址到整型元组start_ip = extract_ip(sys.argv[1])end_ip = extract_ip(sys.argv[2])# 执行主函数asyncio.run(main(start_ip, end_ip))

根据你的应用和机器的具体情况调整线程池的大小。对于高并发的DNS查询,使用异步IO(如asyncio库)可能比多线程更有效率。例如dnspython提供的异步解析功能,可能比使用socket.gethostbyname更高效。实现这些优化策略后,你应该能够显著提高Python程序中DNS查询的性能。如果有更好的建议欢迎评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/585987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT应用开发案例——阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

【SQL Server】2. 将数据导入导出到Excel表格当中

最开始&#xff0c;博主介绍一下自己的环境&#xff1a;SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…

提升K8S故障排除效率:详解Pod内抓包的高效策略!

在Kubernetes环境中&#xff0c;故障排除是管理者日常工作中不可或缺的一部分。随着容器化应用的广泛采用&#xff0c;需要一种高效的方法来诊断和解决Pod内部的问题。本文将重点介绍如何利用抓包技术提升Kubernetes环境中Pod内部故障排除的效率。 为什么需要Pod内抓包 在Kube…

【算法刷题day10】Leetcode:232.用栈实现队列、225. 用队列实现栈

文章目录 Leetcode 232.用栈实现队列解题思路代码总结 Leetcode 225. 用队列实现栈解题思路代码总结 stack、queue和deque对比 草稿图网站 java的Deque Leetcode 232.用栈实现队列 题目&#xff1a;232.用栈实现队列 解析&#xff1a;代码随想录解析 解题思路 一个栈负责进&a…

python爬虫----了解爬虫(十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

互联网轻量级框架整合之JavaEE基础I

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…

Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表 Golang哈希表的实现&#xff0c;底层数据结构是数组单链表&#xff0c;链表节点由8个key、value和键的高八位组成的。为了方便理解&#xff0c;先简单看一个图快速理解。 我们来看一下Golang哈希表的结构体定义 简单介绍一下结构体中几个关键的…

分布式图床项目

一、图床架构分析 二、后台数据处理框架 秒传: 如果上传的文件已经在服务器中存在了,就不需要二次上传了,但是服务器会对这个文件的引用计数加一,这样服务器就知道这个文件是多个人持有的。先对上传的文件进行 md5 校验来判断服务器中已经存在相同的文件了(同样的文件拿到…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接&#xff0c;一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀&#xff0c;导致APP被封控&#xff0c;设置列入黑名单&#xff0c;借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

什么是智慧公厕?智慧旅游下的智慧公厕功能和特点

智慧旅游下的智慧公厕功能和特点&#xff1f;智慧旅游是景区、公园、游乐场、文化场馆等领域的一种信息化解决方案&#xff0c;智慧公厕是智慧旅游极为重要的一部分&#xff0c;能大大提升游客满意度。智慧公厕采用物联网、互联网、大数据、云计算等技术&#xff0c;实现旅游景…

Express.js项目实战(1)—— 我的藏书馆

首先新建文件夹——myLibrary 在vscode中点击文件>点击 Duplicate Workspace(以工作区的方式打开文件夹myLibrary) 点击duplicate Workspace&#xff08;打开工作区&#xff09; 之后&#xff0c;会出现以下界面 点击打开文件夹&#xff0c;选择新建的文件夹&#xff0c;会出…

SDWebImage源码解析---疑难问题解答

SDWebImage的简单流程图&#xff1a; 上图大致流程是对的&#xff0c;有几个没写到的地方&#xff1a; 加载沙盒中对应的图片后&#xff0c;不仅要显示&#xff0c;而且要把图片缓存到内存中下载完毕后&#xff0c;有一个异步解码的过程&#xff0c;没体现出来 网上有大佬做了…