2013-09-16 75 views
2

假設你有這樣的事情(從here複製):加快Python腳本的for循環

#!/usr/bin/python 
from scapy.all import * 

TIMEOUT = 2 
conf.verb = 0 
for ip in range(0, 256): 
    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 

無需等待每一個ping來嘗試下一個主機之前完成。我可以每次把循環內部爲沿&中的行背景:

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

跑題了,但你知道,'範圍(0,255)''在結束254'? –

+0

感謝您的錯字更正 – user857990

+1

您可以使用['concurrent.futures'](http://docs.python.org/3/library/concurrent.futures.html#module-concurrent.futures)模塊同時執行ping命令。 –

回答

5

你應該做的第一件事就是改變range(0, 256)的範圍,使其包括0-255。其次,您正在研究Python的線程,它可能與抽象級別的Bash進程守護進程有些相似。

導入多並創建一個池:

from multiprocessing.pool import ThreadPool 
pool = ThreadPool(20) # However many you wish to run in parallel 

所以採取平查找,這是一切的內部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()是所有的線程返回的是什麼等待的時間。