加速Python脚本';s代表循环

加速Python脚本';s代表循环,python,performance,bash,for-loop,Python,Performance,Bash,For Loop,假设你得到了这样的东西(复制自): 在尝试下一个主机之前,无需等待每个ping完成。我是否可以每次将回路内部沿&中的线条放入背景中: for ip in 192.168.0.{0..255}; do ping -c 1 $ip & done 您应该做的第一件事是将范围更改为范围(0,256),使其包含0-255 第二,您将看到Python的线程,它在某种程度上类似于抽象级别上的Bash进程守护化 导入多处理并创建池: from multiprocessing.pool import

假设你得到了这样的东西(复制自):

在尝试下一个主机之前,无需等待每个ping完成。我是否可以每次将回路内部沿
&
中的线条放入背景中:

for ip in 192.168.0.{0..255}; do 
ping -c 1 $ip &
done

您应该做的第一件事是将范围更改为
范围(0,256)
,使其包含0-255

第二,您将看到Python的线程,它在某种程度上类似于抽象级别上的Bash进程守护化

导入多处理并创建池:

from multiprocessing.pool import ThreadPool
pool = ThreadPool(20)  # However many you wish to run in parallel
因此,使用ping查找,它是for循环中的所有内容,并将其作为一个函数

def ping(ip):
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
    reply = sr1(packet, timeout=TIMEOUT)
    if not (reply is None):
         print reply.src, "is online"
    else:
         print "Timeout waiting for %s" % packet[IP].src
然后在for循环中

for ip in range(0, 256):
    pool.apply_async(ping, (ip,))

pool.close()
pool.join()

pool.join()
等待所有线程返回。

您可以使用
线程化
多处理
模块运行异步/非阻塞IO调用

请阅读关于SO上的差异:


切题,但您是否知道
范围(0255)
结束于
254
?感谢您的打字错误更正,您可以使用模块同时执行ping。您应该使用一些异步库,或者选择。另外,
reply is not None
看起来比
not(reply is None)
;更好)实际上,您可以向capy提供一系列IP地址,它会相应地发送出去,然后您可以单独评估sr的结果,这会更快,因为I/O块应该更少。
for ip in range(0, 256):
    pool.apply_async(ping, (ip,))

pool.close()
pool.join()