Python进度条 - 多线程是解决方案吗?

3
我已经研究了 Python 中的进度条,很多解决方案似乎是基于将工作分成已知的离散块。例如,迭代已知次数并在每次完成百分比向朝着迭代结束的进度条更新 stdout
我的问题略微不同。它涉及遍历包含数百个子目录的用户目录,收集 MP3 信息并将其输入数据库。我可以在迭代之前计算目录中的 MP3 文件数量,并将其用作离散块的指南,但许多 MP3 文件可能已经存在于数据库中,一些文件读取所需的时间比其他文件长,有时会发生错误并需要处理等等。此外,为了以后的参考,我想知道如何使用非离散块完成这项工作。如果您有兴趣,以下是我的目录遍历/数据库更新代码:
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)我正在为一个依赖性较小的情况进行开发。


可能相关的内容:https://dev59.com/XXA75IYBdhLWcg3wrrNS - John
1个回答

3
如果你不知道前面有多少步骤,那么你怎么能获得进展呢?这是第一件事。在开始工作之前,您必须先计算所有步骤。
现在,即使任务在完成所需的时间上有所不同,您也不需要担心。想想游戏。有时当您看到进度条时,它们似乎停在一个点,然后非常快地跳过去。实际上,这正是在幕后发生的情况:某些任务比其他任务需要更长的时间。但这并不是什么大问题(除非该任务真的很长,例如几分钟)。
当然,您可以使用线程。使用队列和线程池可能非常简单。例如,运行20个线程并构建一组工作队列。您的进度将成为队列中项目的数量,队列的初始长度是限制。这似乎是一个很好的设计。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接