这个问题正在寻求建议以及一些代码的帮助。
我目前正在学习 Python 3.4我已经构建了一个基本的网络检查工具,我从文本文件中导入项目,对于每个项目,我希望 python 检查 dns(使用 pydns),ping ip(使用子进程调用操作系统本机 ping)。
目前,我正在检查5000到9000,000个IP地址,并且需要几个小时,大约需要4个小时才能返回所有结果。
我想知道我是否可以使用多处理或线程来加快速度,但仍然将输出返回到列表,以便可以将该行批量写入脚本末尾的 csv 文件。
我是python的新手,所以请告诉我我是否也忽略了一些我应该做的事情。
主代码http://pastebin.com/ZS23XrdE
类http://pastebin.com/kh65hYhG
多个线程来运行子进程(在您的情况下ping
)并收集它们的输出,但这不是必需的。下面是如何使用线程池发出多个 http 请求的代码示例。下面是使用 concurrent.futures
并发发出 DNS 请求的代码。
您不需要多个线程/进程来检查 5000-9000 个 IP(DNS、ICMP)。您可以使用gevent
、twisted
asyncio
在同一进程中建立网络连接。
由于大多数工作似乎都是基于 IO 的,因此您可以轻松地依赖 Threads。
看看cocurrent.futures中的Executor.map()函数:https://docs.python.org/3/library/concurrent.futures.html
您可以传递 IP 列表和要针对每个元素运行的函数,返回的值实际上是给定函数的结果列表。
在特定情况下,您可以将两个worker的方法(check_dns_ip和os_ping)包装在一个方法中,并将其传递给ThreadPoolExecutor.map函数。