Catch sigint, and exit, while trying not to be destructive to file handles, See #33
This commit is contained in:
parent
edf8448274
commit
d2826dde8b
|
@ -26,6 +26,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import re
|
import re
|
||||||
|
import signal
|
||||||
from xml.dom import minidom as DOM
|
from xml.dom import minidom as DOM
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -138,15 +139,12 @@ class FileGetter(threading.Thread):
|
||||||
self.starttime = start
|
self.starttime = start
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
def get_result(self):
|
|
||||||
return self.result
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.result = [0]
|
self.result = [0]
|
||||||
try:
|
try:
|
||||||
if (time.time() - self.starttime) <= 10:
|
if (time.time() - self.starttime) <= 10:
|
||||||
f = urlopen(self.url)
|
f = urlopen(self.url)
|
||||||
while 1:
|
while 1 and not shutdown_event.is_set():
|
||||||
self.result.append(len(f.read(10240)))
|
self.result.append(len(f.read(10240)))
|
||||||
if self.result[-1] == 0:
|
if self.result[-1] == 0:
|
||||||
break
|
break
|
||||||
|
@ -163,7 +161,7 @@ def downloadSpeed(files, quiet=False):
|
||||||
thread = FileGetter(file, start)
|
thread = FileGetter(file, start)
|
||||||
thread.start()
|
thread.start()
|
||||||
q.put(thread, True)
|
q.put(thread, True)
|
||||||
if not quiet:
|
if not quiet and not shutdown_event.is_set():
|
||||||
sys.stdout.write('.')
|
sys.stdout.write('.')
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
@ -172,18 +170,21 @@ def downloadSpeed(files, quiet=False):
|
||||||
def consumer(q, total_files):
|
def consumer(q, total_files):
|
||||||
while len(finished) < total_files:
|
while len(finished) < total_files:
|
||||||
thread = q.get(True)
|
thread = q.get(True)
|
||||||
thread.join()
|
while thread.is_alive():
|
||||||
|
thread.join(timeout=0.1)
|
||||||
finished.append(sum(thread.result))
|
finished.append(sum(thread.result))
|
||||||
del thread
|
del thread
|
||||||
|
|
||||||
q = Queue(6)
|
q = Queue(6)
|
||||||
start = time.time()
|
|
||||||
prod_thread = threading.Thread(target=producer, args=(q, files))
|
prod_thread = threading.Thread(target=producer, args=(q, files))
|
||||||
cons_thread = threading.Thread(target=consumer, args=(q, len(files)))
|
cons_thread = threading.Thread(target=consumer, args=(q, len(files)))
|
||||||
|
start = time.time()
|
||||||
prod_thread.start()
|
prod_thread.start()
|
||||||
cons_thread.start()
|
cons_thread.start()
|
||||||
prod_thread.join()
|
while prod_thread.is_alive():
|
||||||
cons_thread.join()
|
prod_thread.join(timeout=0.1)
|
||||||
|
while cons_thread.is_alive():
|
||||||
|
cons_thread.join(timeout=0.1)
|
||||||
return (sum(finished)/(time.time()-start))
|
return (sum(finished)/(time.time()-start))
|
||||||
|
|
||||||
|
|
||||||
|
@ -198,12 +199,10 @@ class FilePutter(threading.Thread):
|
||||||
self.starttime = start
|
self.starttime = start
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
def get_result(self):
|
|
||||||
return self.result
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
try:
|
try:
|
||||||
if (time.time() - self.starttime) <= 10:
|
if ((time.time() - self.starttime) <= 10 and
|
||||||
|
not shutdown_event.is_set()):
|
||||||
f = urlopen(self.url, self.data)
|
f = urlopen(self.url, self.data)
|
||||||
f.read(11)
|
f.read(11)
|
||||||
f.close()
|
f.close()
|
||||||
|
@ -222,7 +221,7 @@ def uploadSpeed(url, sizes, quiet=False):
|
||||||
thread = FilePutter(url, start, size)
|
thread = FilePutter(url, start, size)
|
||||||
thread.start()
|
thread.start()
|
||||||
q.put(thread, True)
|
q.put(thread, True)
|
||||||
if not quiet:
|
if not quiet and not shutdown_event.is_set():
|
||||||
sys.stdout.write('.')
|
sys.stdout.write('.')
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
@ -231,18 +230,21 @@ def uploadSpeed(url, sizes, quiet=False):
|
||||||
def consumer(q, total_sizes):
|
def consumer(q, total_sizes):
|
||||||
while len(finished) < total_sizes:
|
while len(finished) < total_sizes:
|
||||||
thread = q.get(True)
|
thread = q.get(True)
|
||||||
thread.join()
|
while thread.is_alive():
|
||||||
|
thread.join(timeout=0.1)
|
||||||
finished.append(thread.result)
|
finished.append(thread.result)
|
||||||
del thread
|
del thread
|
||||||
|
|
||||||
q = Queue(6)
|
q = Queue(6)
|
||||||
start = time.time()
|
|
||||||
prod_thread = threading.Thread(target=producer, args=(q, sizes))
|
prod_thread = threading.Thread(target=producer, args=(q, sizes))
|
||||||
cons_thread = threading.Thread(target=consumer, args=(q, len(sizes)))
|
cons_thread = threading.Thread(target=consumer, args=(q, len(sizes)))
|
||||||
|
start = time.time()
|
||||||
prod_thread.start()
|
prod_thread.start()
|
||||||
cons_thread.start()
|
cons_thread.start()
|
||||||
prod_thread.join()
|
while prod_thread.is_alive():
|
||||||
cons_thread.join()
|
prod_thread.join(timeout=0.1)
|
||||||
|
while cons_thread.is_alive():
|
||||||
|
cons_thread.join(timeout=0.1)
|
||||||
return (sum(finished)/(time.time()-start))
|
return (sum(finished)/(time.time()-start))
|
||||||
|
|
||||||
|
|
||||||
|
@ -338,9 +340,20 @@ def getBestServer(servers):
|
||||||
return best
|
return best
|
||||||
|
|
||||||
|
|
||||||
|
def ctrl_c(signum, frame):
|
||||||
|
global shutdown_event
|
||||||
|
shutdown_event.set()
|
||||||
|
raise SystemExit('\nCancelling...')
|
||||||
|
|
||||||
|
|
||||||
def speedtest():
|
def speedtest():
|
||||||
"""Run the full speedtest.net test"""
|
"""Run the full speedtest.net test"""
|
||||||
|
|
||||||
|
global shutdown_event
|
||||||
|
shutdown_event = threading.Event()
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, ctrl_c)
|
||||||
|
|
||||||
description = (
|
description = (
|
||||||
'Command line interface for testing internet bandwidth using '
|
'Command line interface for testing internet bandwidth using '
|
||||||
'speedtest.net.\n'
|
'speedtest.net.\n'
|
||||||
|
|
Loading…
Reference in New Issue