使用gevent进行并行ping测试

3

我是Python的新手,正在尝试运行这段代码以实现对多台机器进行并行ping测试。但是我无法同时ping所有IP地址,似乎它是一个接一个地运行。请问有谁能指导我如何同时ping多个服务器?

import gevent
import urllib2
import os
from gevent import monkey
monkey.patch_all()


def print_head(i):
    switch='192.168.182.170'
    response = os.system("ping -c 5 " + switch)


jobs = [gevent.spawn(print_head, i) for i  in range(1,10)]
gevent.joinall(jobs, timeout=2)
2个回答

1

os.system没有被修补,但是subprocess.call已经被修补;请用subprocess.call替换os.system(如果你使用的是Python 3.5+,也可以使用subprocess.run

import subprocess

...

def print_head(i):
    switch = '192.168.182.170'
    response = subprocess.call("ping " + switch, shell=True)

0
问题在于os.system("ping -c 5 " + switch)是同步运行的,因为该函数是阻塞的。你应该尝试在不同的进程中执行它。
这里是一个并发代码,可以实现相同的功能。
from multiprocessing import Process
import os

def print_head(i):
    switch='192.168.182.170'
    response = os.system("ping -c 5 " + switch)

processes = [Process(target=print_head, args=(i,)) for i in range(1,10)]
for process in processes:
    process.start()

嘿 Tim,感谢你提供的这个解决方案。但是如果我运行它针对 10000 台服务器,它需要大约 90 秒的时间。是否有任何方法可以提高这个脚本的性能,使其少于 60 分钟? - YMC M
每个进程90秒? - Tim Givois
抱歉造成困惑。如果我使用像---processes = [Process(target=print_head, args=(i,)) for i in range(1,10000)]这样的代码,那么它需要大约90秒才能完成。有没有什么方法可以缩短到接近60秒? - YMC M
你可以尝试使用池和映射吗?链接 - Tim Givois
`from multiprocessing import Pool import osdef print_head(i): switch='192.168.182.170' response = os.system("ping -c 5 " + switch)p = Pool(10) p.map(print_head, xrange(10))` - Tim Givois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接