了解如何在构建进度条时为任务计时

Knowing how to time a task when building a progress bar

在我的程序中,用户上传了一个 csv 文件。 当我的应用正在上传和处理文件时,我想显示一个进度条。

问题是这个过程并不完全在我的控制之下(我真的不知道文件完成加载和处理需要多长时间,因为这取决于文件内容和尺寸)。

执行此操作的正确方法是什么?这不像我有很多步骤,我可以在每一步发生时增加进度条....它基本上是在等待文件加载,我无法确定时间!

这可能吗?

提前致谢

你没有提供太多细节,所以我会解释我的想法,并根据我的思考过程给出一些建议。

You have some kind of app that has some kind of function/process that is a black-box (i.e you can't see inside it or change it), this black-box uploads a csv file to some server and returns control back to your app when it's done. Since you can't see inside the black-box you can't determine how much it has uploaded and thus can't create an accurate progress bar.

命名管道: 如果您只将 csv 的文件名传递给黑匣子,您可以创建一个 named pipe (取决于您的情况。)由于命名管道在缓冲区已满后阻塞 - 直到接收器读取它,您可以跟踪已阅读了多少,从而创建一个准确的进度条。

因此您将创建一个命名管道,将其文件名传递给黑盒,然后从 csv 中读取并写入命名管道。您读了多远 - 就是您的进步。

更多Pythonic: 由于您标记了 Python,如果您将 csv 作为类文件对象传递,此 activestate recipe 可能会有所帮助。 Python.

同样的想法

结论:这是两种可能的解决方案。我累了,可能还有更多 - 但我帮不上忙,因为你没有给我们太多的工作。

抽象层面回答你的问题:你无法为黑盒函数制作准确的进度条,毕竟它们可以休眠(random()) 尽你所能调用它们。

有一些特定于实现的解决方法,上面的两个想法是示例:想法是您可以让黑盒取而代之的是一个流,并在您通过它们时计算字节数。

或者您可以 guess/approximate,粗略计算输入的字节数和(先前计算的)每字节平均速度会给您 一些指示何时完成。您甚至可以节省每次 运行 编写代码的时间,并且每次都会自动改进之前的想法。