ping multiple Ips with python
Branimir Petrovic
BranimirPetrovic at yahoo.com
Mon Jan 6 23:10:06 EST 2003
dhostetler at sopris.net (.d.hos) wrote in message news:<8db020b9.0301061545.48785623 at posting.google.com>...
>
> I looked into other multithreaded examples on the web and came up with
> the following:
>
> =============================
> import threading, os
>
> def log(s):
> print s
>
> class Pinger(threading.Thread):
> def __init__(self, address, *args, **kwargs):
> self.address = address
> threading.Thread.__init__(self, *args, **kwargs)
>
> def run(self):
> pingCard = "ping -n 10 " + self.address
> child = os.popen(pingCard).readlines()
> log(child)
>
>
> if __name__ == '__main__':
>
> PingList = ["127.0.0.1", "66.218.71.83", "64.66.148.171"]
> threadList = []
>
> # Create threads
> for i in PingList :
> threadList.append(Pinger(i))
>
> # Start all threads
> for thread in threadList:
> thread.start()
> ============================================
>
> when run through idle, the python shell hangs after all the ips
> respond. Do I have to stop each thread individually after it executes
> the ping command? other than that it seems to work....
>
"""Being Python newbie myself, also interested in multithreading,
I reworked slightly your code, adding (what I beleive) thread
safe output. Threads will die having depleated all assigned
tasks after pushing results into passed Queue instance (or when
run method ends). Your issue with idle is probably idle related,
your code (and my mod too) runs just fine from command line.
Quite amazing what Python can do in only few lines of code...
Branimir
"""
import threading, os, Queue, time
def showResponse(args):
"""Pretty prints passed tuple to stdout"""
stdoutLi, ip, threadNo = args
print 'Host \t%s \nThread \t%s\n' % (ip, threadNo)
for line in stdoutLi:
line = line.strip()
if not line: continue
print '\t' + line
print '='*72
class Pinger(threading.Thread):
def __init__(self, address, queue, threadNo=None):
self.__address = address
self.__queue = queue
self.__threadNo = threadNo
threading.Thread.__init__(self)
def run(self):
pingCmd = "ping -n 1 -w 3000 " + self.__address
childStdout = os.popen(pingCmd)
result = (childStdout.readlines(), self.__address, self.__threadNo)
childStdout.close()
self.__queue.put(result)
if __name__ == '__main__':
# watch dog timeout value (allow __main__ to run up to N seconds)
wdt = 10.0
# make list of hosts to ping
hostLi = ["127.0.0.1", "66.218.71.83", "64.66.148.171"]
# ping results go to the Queue's instance
q = Queue.Queue()
i = 0
while i < len(hostLi):
"""Create and start all necessary threads, passing results
out via thread safe Queue instance.
It probably is a bad idea to start too many concurrent threads?
"""
Pinger(hostLi[i], q, i+1).start()
i +=1
startT = time.time()
while i > 0 and ((time.time() - startT) < wdt):
"""Loop ends when:
All responses to dispatched pings arrive,
OR
Max allowed wait time is exceeded"""
showResponse(q.get())
i -= 1
More information about the Python-list
mailing list