57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
# 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
|