带有 while 循环的函数的 `tqdm` 包装器
`tqdm` wrapper for function with while loop
我有一个长期存在的库函数,我无法编辑它运行一个 while 循环和 returns 一个值。本质上是这样的:
import time
def myfunc():
i = 0
while i < 5 * 1000:
i += 1
time.sleep(0.001)
return i
有没有一种方法可以包装这个函数,也许是在一个装饰器中,这样它就可以传递给 tqdm
并吐出一个进度条?我不太确定如何实现这一点,因为我无法编辑 myfunc
.
中的代码
我的目标是为 myfunc
制作一个进度条而不用触摸它。有人有什么建议吗?
没有合法的方法可以做到这一点,除非这个函数returns和Iterable/Generator。但是,当然,您可以在线程中启动该函数,然后通过执行
之类的操作来模拟加载
import time, tqdm, concurrent
def myfunc():
i = 0
while i < 5 * 1000:
i += 1
time.sleep(0.001)
return i
def simulate_loading(background_function):
with concurrent.futures.ThreadPoolExecutor() as executor:
future = executor.submit(background_function)
while not future.done():
yield
time.sleep(0.05)
return future.result()
for _ in tqdm.tqdm(simulate_loading(myfunc)):
pass
115it [00:05, 19.85it/s]
我有一个长期存在的库函数,我无法编辑它运行一个 while 循环和 returns 一个值。本质上是这样的:
import time
def myfunc():
i = 0
while i < 5 * 1000:
i += 1
time.sleep(0.001)
return i
有没有一种方法可以包装这个函数,也许是在一个装饰器中,这样它就可以传递给 tqdm
并吐出一个进度条?我不太确定如何实现这一点,因为我无法编辑 myfunc
.
我的目标是为 myfunc
制作一个进度条而不用触摸它。有人有什么建议吗?
没有合法的方法可以做到这一点,除非这个函数returns和Iterable/Generator。但是,当然,您可以在线程中启动该函数,然后通过执行
之类的操作来模拟加载import time, tqdm, concurrent
def myfunc():
i = 0
while i < 5 * 1000:
i += 1
time.sleep(0.001)
return i
def simulate_loading(background_function):
with concurrent.futures.ThreadPoolExecutor() as executor:
future = executor.submit(background_function)
while not future.done():
yield
time.sleep(0.05)
return future.result()
for _ in tqdm.tqdm(simulate_loading(myfunc)):
pass
115it [00:05, 19.85it/s]