Skip to content

Instantly share code, notes, and snippets.

@sourceperl
Last active April 12, 2024 18:56
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save sourceperl/10288663 to your computer and use it in GitHub Desktop.
Save sourceperl/10288663 to your computer and use it in GitHub Desktop.
Python script for do multi-threaded ping
#!/usr/bin/env python
# ping a list of host with threads for increase speed
# use standard linux /bin/ping utility
from threading import Thread
import subprocess
try:
import queue
except ImportError:
import Queue as queue
import re
# some global vars
num_threads = 15
ips_q = queue.Queue()
out_q = queue.Queue()
# build IP array
ips = []
for i in range(1,200):
ips.append("192.168.0."+str(i))
# thread code : wraps system ping command
def thread_pinger(i, q):
"""Pings hosts in queue"""
while True:
# get an IP item form queue
ip = q.get()
# ping it
args=['/bin/ping', '-c', '1', '-W', '1', str(ip)]
p_ping = subprocess.Popen(args,
shell=False,
stdout=subprocess.PIPE)
# save ping stdout
p_ping_out = str(p_ping.communicate()[0])
if (p_ping.wait() == 0):
# rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms
search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms',
p_ping_out, re.M|re.I)
ping_rtt = search.group(2)
out_q.put("OK " + str(ip) + " rtt= "+ ping_rtt)
# update queue : this ip is processed
q.task_done()
# start the thread pool
for i in range(num_threads):
worker = Thread(target=thread_pinger, args=(i, ips_q))
worker.setDaemon(True)
worker.start()
# fill queue
for ip in ips:
ips_q.put(ip)
# wait until worker threads are done to exit
ips_q.join()
# print result
while True:
try:
msg = out_q.get_nowait()
except queue.Empty:
break
print(msg)
#!/usr/bin/env python
# ping a list of host with threads for increase speed
# design to use data from/to SQL database
# use standard linux /bin/ping utility
from threading import Thread
import mysql.connector
import subprocess
try:
import queue
except ImportError:
import Queue as queue
import time
import re
# some global vars
num_threads = 30
ips_q = queue.Queue()
out_q = queue.Queue()
# thread code : wraps system ping command
def thread_pinger(i, q):
"""Pings hosts in queue"""
while True:
# get an IP item form queue
item = q.get()
# ping it
args=['/bin/ping', '-c', '1', '-W', str(item['timeout']),
str(item['ip'])]
p_ping = subprocess.Popen(args,
shell=False,
stdout=subprocess.PIPE)
# save ping stdout
p_ping_out = str(p_ping.communicate()[0])
# ping return 0 if up
if (p_ping.wait() == 0):
# rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms
search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms',
p_ping_out, re.M|re.I)
item['up'] = True
item['rtt'] = search.group(2)
else:
item['up'] = False
# update output queue
out_q.put(item)
# update queue : this ip is processed
q.task_done()
# start the thread pool
for i in range(num_threads):
worker = Thread(target=thread_pinger, args=(i, ips_q))
worker.setDaemon(True)
worker.start()
# build IP array
ips = []
for i in range(1,200):
ips.append("192.168.0."+str(i))
# main loop
while True:
# retreive data from DB
# add SQL here
# test start time
start = time.time()
# fill queue
for ip in ips:
ips_q.put({'ip': ip, 'timeout': 1})
# wait until worker threads are done to exit
ips_q.join()
# display result
print("next:")
while True:
try:
msg = out_q.get_nowait()
except queue.Empty:
break
if msg['up']:
print(msg)
# test start end
end = time.time()
loop_time = round(end - start, 2)
print("loop time: %s" % (loop_time))
# update DB
#add SQL here
# wait 5s before next cycle
time.sleep(5.0)
@sourceperl
Copy link
Author

Unfortunately not, do you have the same problem with basic code like this one: https://gist.github.com/sourceperl/0ef3719e8fef2c95d98c590ff1e7cefd ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment