异步进度旋转器

met*_*r23 3 python progress

这是进度旋转器的代码:

import sys
import time

def spinning_cursor():
    while True:
        for cursor in '|/-\\':
            yield cursor

spinner = spinning_cursor()
for _ in range(50):
    sys.stdout.write(spinner.next())
    sys.stdout.flush()
    time.sleep(10)
    sys.stdout.write('\b')
Run Code Online (Sandbox Code Playgroud)

输出

python2.7 test.py
|
Run Code Online (Sandbox Code Playgroud)

由于循环休眠了 10 秒,它的旋转速度非常慢......

如何在进程休眠时继续旋转旋转器?

dis*_*ame 7

您必须创建一个单独的线程。下面的示例粗略地展示了如何做到这一点。然而,这只是一个简单的例子。

import sys
import time

import threading


class SpinnerThread(threading.Thread):

    def __init__(self):
        super().__init__(target=self._spin)
        self._stopevent = threading.Event()

    def stop(self):
        self._stopevent.set()

    def _spin(self):

        while not self._stopevent.isSet():
            for t in '|/-\\':
                sys.stdout.write(t)
                sys.stdout.flush()
                time.sleep(0.1)
                sys.stdout.write('\b')


def long_task():
    for i in range(10):
        time.sleep(1)
        print('Tick {:d}'.format(i))


def main():

    task = threading.Thread(target=long_task)
    task.start()

    spinner_thread = SpinnerThread()
    spinner_thread.start()

    task.join()
    spinner_thread.stop()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)