【问题标题】:Show function status using Python standard library使用 Python 标准库显示函数状态
【发布时间】:2015-02-02 21:46:37
【问题描述】:

我正在调用一个函数(无法修改)来分析数据,它可能需要几分钟到几小时才能完成。我正在尝试定期打印状态/进度,让用户知道分析仍在进行中。

自:

  1. 我不知道先验分析需要多长时间
  2. 我只能使用 Python 的标准库

然后使用进度条包将不起作用。我可以使用多处理来实现这一点:

import multiprocessing.pool import ThreadPool
import time

def analysis():
    #Perform analysis that takes a long time and cannot be modified

pool = ThreadPool(processes=2)
t = pool.apply_async(func = analysis)
start_time = time.time()
while not t.ready():
    print "Analyzing..."
    time.sleep(2)

如果我可以避免使用多进程并且它可以像 linux“watch”命令那样简单地就地更新,那就太好了。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    不完全确定您在问什么。如果您希望“仍在分析”消息就地更新,而不是在输出中逐行添加,您可以尝试以下操作:

    spinner = itertools.cycle("|/~\\")
    while not t.ready():
        sys.stdout.write("\r%s: still analyzing %s" % (time.ctime(), next(spinner)))
        sys.stdout.flush()
        time.sleep(.5)
    

    这里,\r 字符(回车)用于将输出位置重置为行首。这将使用当前时间和“微调器”动画定期更新该行。

    在 Python 3 中,您可以对 print 函数的参数执行相同的操作。对于更复杂的输出,您可以考虑使用curses。请参阅this 以获取一个小示例。


    如果您想对多个函数执行此操作,或者对同一个函数进行多次调用,您也可以将其设为装饰器。然后每次调用该函数都会以这种方式执行。这仍然使用进程,但现在它们对用户隐藏。

    def monitor(f):
        def f_():
            pool = ThreadPool(processes=2)
            t = pool.apply_async(func=f)
            spinner = itertools.cycle("|/~\\")
            while not t.ready():
                sys.stdout.write("\r%s: running %s %s" % (time.ctime(), f.__name__, next(spinner)))
                sys.stdout.flush()
                time.sleep(.5)
            sys.stdout.write("\n")
        return f_
    
    @monitor
    def analysis():
        time.sleep(4)
    
    analysis()
    

    当然,这是一个非常简单的版本,它既不支持参数也不支持返回值。说实话,到目前为止我还没有在 Python 中使用过线程,我不想展示任何错误。

    【讨论】:

    • 我认为这回答了我问题的第二部分。我应该更清楚,但是有没有办法在不使用多处理的情况下执行函数并打印“仍在分析”?
    • @slaw 你的意思是,根本不使用多处理,还是不明确使用它?我想您可以将所有这些包装在装饰器函数中...
    • 是的,没有多重处理
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多