在上一个装饰器工作时,跑了20秒后就停止了。如果运行的函数跑了60秒,后面的40秒我们是只能等到结束才知道一共运行了多少秒。在新的进阶版里,我们加入了多线程的功能来给进度条续命,以15秒为基础,15个跑完了续3个,直到结束为止。
def timer_pbar(func): @wraps(func) def wrapper(*args, **kwargs): print(f"{dt.now().strftime('%H:%M:%S')}") start = time.time() pbar = tqdm( total=15, bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}', desc=f"\rProcessing {func.__name__!r}", position=0, colour='#32CD32', # limegreen HEX code ) for i in range(15): if i < 15: time.sleep(1) pbar.update(1) # run the decorated function in a separated thread for extension from threading import Thread result = None def target(): nonlocal result result = func(*args, **kwargs) thread = Thread(target=target) thread.start() # extend the progress bar if the function is still running while thread.is_alive(): pbar.total += 3 for i in range(3): pbar.update(1) time.sleep(1) pbar.close() end = time.time() print(f"运行时间{func.__name__!r}: {end - start:.3f}秒") return result return wrapper
'运行
在DataSepll运行ipynb和PyCharm里运行DASH都看着还是可以的。
但是有个问题,其实函数是在15~18秒之间结束的,所以运行时间反映出来的是progresss_bar的时间,而不是函数的时间。希望大家注意哟,主要是多线程导致的。希望这篇blog对您有所帮助和启迪。