Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于非循环函数的Python进度条_Python_Progress Bar - Fatal编程技术网

用于非循环函数的Python进度条

用于非循环函数的Python进度条,python,progress-bar,Python,Progress Bar,给定函数f,为f编码进度条的最佳方法是什么?也就是说,有一个实时进度条,在执行f期间更新。请注意,我无法更改f(这是另一个库中的函数),因此无法插入pbar.update调用f(因此这是一篇关于非循环函数进度条的帖子)。其他SO帖子在您可以在f中更改代码的情况下解决了这个问题,但当我无法访问f的内容时,我找不到/想不出解决方案 我是否需要使用线程或多处理来实现类似的功能 比如: @进度条 def func_包装(*参数,**kwargs): 返回f(*args,**kwargs) 或: sta

给定函数
f
,为
f
编码进度条的最佳方法是什么?也就是说,有一个实时进度条,在执行
f
期间更新。请注意,我无法更改
f
(这是另一个库中的函数),因此无法插入
pbar.update
调用
f
(因此这是一篇关于非循环函数进度条的帖子)。其他SO帖子在您可以在
f
中更改代码的情况下解决了这个问题,但当我无法访问
f
的内容时,我找不到/想不出解决方案

我是否需要使用线程或多处理来实现类似的功能

比如:

@进度条
def func_包装(*参数,**kwargs):
返回f(*args,**kwargs)
或:

start\u progress\u bar()
f()
感谢您的帮助

更新:我已经使用@Acorn的答案中提供的代码,并以decorator的形式重写了它

import concurrent.futures
导入功能工具
导入时间
从TQM导入TQM
def进度条(预期时间,增量=10):
定义进度条(func):
def定时进度条(未来、预期时间、增量=10):
"""
显示预期时间秒的进度条。
如果将来完成,请尽早完成。
如果未在预期时间内完成,请等待未来。
"""
间隔=预期时间/增量
将tqdm(总计=增量)作为pbar:
对于范围内的i(增量-1):
如果future.done():
#完成进度条
#不知道有没有更干净的方法?
pbar.更新(增量-i)
返回
其他:
睡眠时间(间隔)
pbar.update()
#如果未来还没有完成,等待它。
future.result()
pbar.update()
@functools.wrapps(func)
定义函数(*args,**kwargs):
将concurrent.futures.ThreadPoolExecutor(max_workers=1)作为池:
future=pool.submit(func、*args、**kwargs)
定时进度条(未来、预期时间、增量)
返回future.result()
返回函数
返回进度条
如果名称=“\uuuuu main\uuuuuuuu”:
@进度条(预计时间=11)
def test_func():
时间。睡眠(10)
返回“结果”
打印(test_func())#打印“结果”

如果函数不允许您在工作单元之后执行操作,即通过公开生成器接口或某种回调,那么唯一的解决方案是使用修改后的函数版本,或执行某种monkeypatching

解决方案将针对所讨论的代码


更新: 因此,如果你不介意进度条不能准确反映进度,而只是使用时间估算,你可以这样做

import concurrent.futures
导入时间
从TQM导入TQM
def定时\未来\进度\条(未来、预期\时间、增量=10):
"""
显示预期时间秒的进度条。
如果将来完成,请尽早完成。
如果未在预期时间内完成,请等待未来。
"""
间隔=预期时间/增量
将tqdm(总计=增量)作为pbar:
对于范围内的i(增量-1):
如果future.done():
#完成进度条
#不知道有没有更干净的方法?
pbar.更新(增量-i)
返回
其他:
睡眠时间(间隔)
pbar.update()
#如果未来还没有完成,等待它。
future.result()
pbar.update()
def阻塞_作业():
时间。睡眠(2)
返回“结果”
def main():
将concurrent.futures.ThreadPoolExecutor(max_workers=1)作为池:
future=pool.submit(阻止作业)
定时的未来进度条(未来,5)
打印(f'完成的工作:{future.result()}')
main()

无论工作花费的时间比预期的多还是少,这都应该表现得明智。如果作业的运行时间比预期的长,则进度将以90%的速度等待,直到作业完成。

是否希望在每次调用
f
时更新进度条,还是在
f
中每次发生
循环时更新进度条?前者是你的注释,而后者需要
f
来支持
回调
,或者,正如你所提到的,访问
f
的内容。你可能通过某种monkeypatching来实现后者。这实际上取决于“f”是什么。函数调用将首先执行,经过一段时间后可能会返回。不能保证“进度条”的概念对函数有意义,因此必须围绕该函数的工作方式专门设计进度条。这个问题不会有“通用”的解决方案,谢谢您的回复。如果我知道要花多少时间呢?有没有办法在执行
f
的同时运行一段时间的进度条?@RyanPark,用基于asyncio的解决方案更新我的答案,并在线程中运行阻塞
f
。简化我的解决方案以避免使用不必要的asyncio。感谢您的帮助。我以前从未使用过
concurrent
;您是否介意将concurrent.futures.ThreadPoolExecutor(max\u workers=1)的行
解释为pool:
,以供将来参考?为什么
max\u workers
设置为1?抱歉,如果您觉得这很明显,我只是对并发一无所知。
max\u workers
是可以同时运行的线程数。希因