我创建了一个简单的脚本,该脚本遍历需要ping和nslookup的服务器列表。问题是,查验可能需要一些时间,特别是要查验更多的服务器,而不是一天几秒钟。
我刚开始编程,我知道多处理或多线程可能是使我的工作运行更快的解决方案。
我的计划是获取服务器列表,或者1.将其分成大小相等的列表,并与线程/进程匹配的列表数量;或者2.如果这些选项之一支持它,请遍历单个列表,并通过每个列表完成先前的ping和nslookup之后,将服务器名称分配给线程或进程。这样做是可取的,因为这样可以确保我花费最少的时间,就像列表1拥有200个脱机服务器,列表6拥有2000个脱机服务器一样,它需要等待使用列表6的过程完成,即使所有其他服务器都可以免费点。
哪个胜任这项任务?为什么?
如果可能,我如何确保每个线程或进程具有基本相同的运行时
即使现在很简单的代码片段
import subprocess
import time
server_file = open(r"myfilepath", "r")
initial_time = time.time()
for i in range(1000):
print(server_file.readline()[0:-1]+ ' '+str(subprocess.run('ping '+server_file.readline()[0:-1]).returncode)) #This returns a string with the server name, and return code,
print(time.time()-initial_time)
出现此问题是因为ping失败平均平均需要3秒钟以上。我也知道,不放置print语句会使其更快,但是我想监视它的情况很小。我对100,000台服务器的影响进行了ping操作,这需要按常规进行,并且列表会不断增长
TLDR;MultiThreading是您的解决方案-线程模块使用线程,多处理模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程具有单独的内存。
至于问题1
对于IO任务,例如查询数据库或加载网页,CPU只是在等待答案而没有做任何事情,这是浪费资源,因此多线程是答案(:
至于问题2-
您只需创建线程池即可管理它们同时运行,而无需费力。
谢谢,我会研究这个问题,如果它能解决问题,请您投票。目前,我在前1k服务器上进行的测试需要3389秒才能ping通,男孩对此并不好玩
np芽,如果线程池不能节省时间,请打我(:
@AlbinoRhino所以...有效吗?(:
多线程似乎是正确的解决方案,所以我支持您。Ive在底部添加了一个答案(但我可能只是将其编辑为我的问题),显示了我的代码现在运行速度提高了75倍,并且我相信我实际上可以运行更多的内核而没有任何实际问题
大!如果您也可以接受我的回答,我将不胜感激(: