本文借助动态转圈圈的例子展示
import sys import itertools import time import threading class Signal: go = True def spin(msg, signal): write, flush = sys.stdout.write, sys.stdout.flush for char in itertools.cycle('|\-//'): status = char + ' ' + msg write(status) flush() write('\x08' * len(status)) if not signal.go: break write('\x08' * len(status)) def slow_func(): time.sleep(3) return 42 def supervisor(): signal = Signal() spinner = threading.Thread(target=spin, args=('hahaha', signal)) print('spin obj:', spinner) spinner.start() result = slow_func() signal.go = False # 结束一个线程 spinner.join() return result def main(): result = supervisor() print('Answer:', result) if __name__ == '__main__': main()
import sys import asyncio import itertools @asyncio.coroutine def spin(msg): write, flush = sys.stdout.write, sys.stdout.flush for char in itertools.cycle('/|-\\'): status = char + ' ' + msg write(status) flush() write('\x08' * len(status)) try: yield from asyncio.sleep(.1) except asyncio.CancelledError as e: break @asyncio.coroutine def slow_func(): yield from asyncio.sleep(3) return 42 @asyncio.coroutine def supervisor(): spinner = asyncio.Task(spin('hahaha')) print('spin obj:', spinner) result = yield from slow_func() spinner.cancel() return result def main(): loop = asyncio.get_event_loop() result = loop.run_until_complete(supervisor()) loop.close() print('Answer:', result) if __name__ == '__main__': main()