gpt4 book ai didi

python - ping ~ 100,000 个服务器,多线程还是多处理更好?

转载 作者:行者123 更新时间:2023-12-04 17:29:34 24 4
gpt4 key购买 nike

我创建了一个简单的脚本,它遍历我需要 ping 和 nslookup 的服务器列表。问题是,ping 可能需要一些时间,尤其是 ping 比一天中的秒数更多的服务器。

我对编程相当陌生,我知道多处理或多线程可能是使我的工作运行得更快的解决方案。

我的计划是获取我的服务器列表和 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 秒以上。此外,我知道不放置打印语句会使它更快,但我想监视它的一个小案例。我正在对 100,000 台服务器的影响进行 ping 操作,这将需要定期执行,并且该列表将继续增长

    最佳答案

    为了获得最佳性能,您既不想要;对于 100,000 个事件作业,最好在单个或可能的少数线程或进程中使用异步处理(但不超过可用内核的数量)。

    使用异步 I/O,许多网络任务可以在单个线程中执行,由于节省了上下文切换(也就是说,您理论上可以在 1 秒内 ping 100,000 台机器),轻松实现 100,000 或更高的速率。

    Python 通过 asyncio 支持异步 I/O ( here's 一个很好的异步和协程介绍)。

    不依赖像 ping 这样的外部进程也很重要。 ,因为产生一个新进程是一个非常昂贵的操作。

    aioping 是使用 asyncio 完成的 native Python ping 的示例(请注意,ping 实际上是一对 ICMP 请求/回复数据包)。应该很容易调整它以同时执行多个 ping。

    关于python - ping ~ 100,000 个服务器,多线程还是多处理更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59993940/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com