from time import sleep
try:
    while True:
        print 'hi'
        sleep( 1 )
except KeyboardInterrupt as error:
    print 'quitting...'
print 'done'
threads are daemons but by having the "main thread" received the control + c
        try:
            for i in xrange( agent_pool.qsize() ):
                my_thread = ThreadUrl( agent_pool.get() , self.files_remaining , self.local_destination_path , self.local_files , retry_count_max )
                my_thread.daemon = True         # does not block the main program from exiting, must use a join() to block
                my_thread.start()                   # starts this thread
            self.files_remaining.join()     # wait on the que until task_done count is correct
        except KeyboardInterrupt:
            with self.files_remaining.mutex:
                self.files_remaining.clear()
(Also use the "poison pill" None method for "normal termination")
for i in xrange( agent_pool.qsize() )
    self.files_remaining.put( None )
In the THREAD
    while True
        if not self.files_remaining.get()
            self.cleanup()
            break