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