# spinner_thread.py # credits: Adapted from Michele Simionato's # multiprocessing example in the python-list: # https://mail.python.org/pipermail/python-list/2009-February/538048.html # BEGIN SPINNER_THREAD import threading import itertools import time import sys class Signal: # <1> go = True def spin(msg, signal): # <2> write, flush = sys.stdout.write, sys.stdout.flush for char in itertools.cycle('|/-\\'): # <3> status = char + ' ' + msg write(status) flush() write('\x08' * len(status)) # <4> time.sleep(.1) if not signal.go: # <5> break write(' ' * len(status) + '\x08' * len(status)) # <6> def slow_computation(): # <7> # fake computation waiting a long time for I/O time.sleep(3) # <8> return 42 def supervisor(): # <9> signal = Signal() spinner = threading.Thread(None, spin, args=('thinking!', signal)) print('spinner object:', spinner) # <10> spinner.start() # <11> result = slow_computation() # <12> signal.go = False # <13> spinner.join() # <14> return result def main(): result = supervisor() # <15> print('Answer:', result) if __name__ == '__main__': main() # END SPINNER_THREAD