Python进度条 - 在这里解决问题吗?

时间:2013-03-13 16:48:24

标签: python multithreading

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

我的问题不那么离散了。它涉及遍历包含数百个子目录的用户目录,收集MP3信息并将其输入数据库。我可以在迭代之前计算目录中MP3文件的数量并将其用作离散块的指导,但是许多mp3可能已经存在于数据库中,一些文件读取时间比其他文件要长,错误将会发生并且必须在某些情况下处理等等。此外,我想知道如何用非离散块来解决这个问题以备将来参考。以下是我的目录 - 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)我正在开发一个依赖精简的情况。

1 个答案:

答案 0 :(得分:3)

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

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

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