Python异步进度微调器

时间:2018-02-18 17:29:59

标签: 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')

输出

python2.7 test.py
|

由于循环睡眠10秒钟,它旋转非常缓慢......

如何在过程休眠期间继续旋转微调器?

3 个答案:

答案 0 :(得分:2)

你可以以较小的步数睡觉,直到达到10秒:

index.html

但是这会阻塞你的主线程,所以只有你想在Python程序中不做任何其他事情等待10秒钟才会有用(例如,等待一些外部进程完成)。

如果要在微调器旋转时运行其他Python代码,则需要两个线程 - 一个用于微调器,一个用于主要工作。你可以这样设置:

import sys, time

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

spinner = spinning_cursor()
end_time = time.time() + 10
while time.time() < end_time:
    sys.stdout.write(spinner.next())
    sys.stdout.flush()
    time.sleep(0.2) # adjust this to change the speed
    sys.stdout.write('\b')

答案 1 :(得分:1)

您必须创建一个单独的线程。下面的例子大致说明了如何做到这一点。但是,这只是一个简单的例子。

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()

答案 2 :(得分:0)

生成两个主题AB。线程A运行cmd完成。线程B显示旋转光标并等待线程A退出,这将在cmd完成时发生。此时,线程B清除旋转光标,然后退出。

或者使用现有的库而不是重新发明轮子。考虑progressbar库。您需要RotatingMarker进度指示器。