3

我对 Python 中的进度条进行了一些研究,许多解决方案似乎都是基于将工作划分为已知的离散块。即,迭代已知次数并在stdout每次接近迭代结束的进度的一个百分点时更新进度条。

我的问题不太离散。它涉及遍历包含数百个子目录的用户目录、收集 MP3 信息并将其输入数据库。我可能会在迭代之前计算目录中 MP3 文件的数量,并将其用作离散块的指南,但是许多 mp3 可能已经在数据库中,有些文件的读取时间比其他文件要长,错误会在某些情况下发生并且必须处理等等。此外,我想知道如何使用非离散块来解决这个问题,以供将来参考。如果您有兴趣,这是我的 directory-walk/database-update 的代码:

import mutagen
import sys
import os
import sqlite3 as lite
for root, dirs, files in os.walk(startDir):

    for file in files:
        if isMP3(file):
            fullPath = os.path.join(root, file)

            # Check if path already exists in DB, skip iteration if so
            if unicode(fullPath, errors="replace") in pathDict:
                continue

            try:
                audio = MP3(fullPath)
            except mutagen.mp3.HeaderNotFoundError: # Invalid file/ID3 info
                #TODO: log for user to look up what files were not visitable
                continue
            # Do database operations and error handling therein. 

线程是处理此类事情的最佳方法吗?如果是这样,是否有任何关于线程如何实现这一点的好例子?我不想要一个模块,因为(a)这似乎是我应该知道如何做的事情,并且(b)我正在为依赖精简的情况进行开发。

4

1 回答 1

3

如果你不知道你面前有多少步,那你怎么能取得进步呢?这是第一件事。在开始工作之前,您必须计算所有这些。

现在,即使任务在完成所需时间方面有所不同,您也不应该担心这一点。想想游戏。有时,当您看到进度条时,它们似乎停在某一点,然后跳得非常快。这正是幕后发生的事情:有些任务比其他任务花费的时间更长。但这没什么大不了的(除非任务真的很长,比如几分钟?)。

当然你可以使用线程。实际上使用 Queue 和 ThreadPool 可能非常简单。例如运行 20 个线程并构建一个作业队列。然后,您的进度将是队列中的项目数,队列的初始长度作为限制。这似乎是一个很好的设计。

于 2013-03-13T16:56:26.203 回答