简单的计时和进度条装饰器 - 多线程进阶版
- 这个进阶版有什么?
- 话不多说上代码
- 效果图
上一篇关于装饰器的Blog
这个进阶版有什么?
在上一个装饰器工作时,跑了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
效果图
看着还行,但是有个问题,其实函数是在15~18秒之间结束的,所以运行时间反映出来的是progresss_bar的时间,而不是函数的时间。希望大家注意哟,主要是多线程导致的。希望这篇blog对您有所帮助和启迪。