Python 进度条 - 线程是解决办法吗?
我在研究Python中的进度条时,发现很多解决方案都是基于将工作分成已知的、离散的部分。也就是说,通常是循环一个已知的次数,每次完成一定的进度就更新一次进度条。
但我的问题有点不同。我需要遍历一个用户目录,这个目录里有成百上千个子目录,收集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) 我正在开发一个对依赖性要求不高的项目。
1 个回答
3
如果你不知道前面还有多少步骤,那你怎么能知道进度呢?这是第一点。在开始工作之前,你得先把所有步骤都数清楚。
即使每个任务完成所需的时间不同,你也不用太担心这个。想想游戏吧。有时候你看到的进度条在某个点上似乎停住了,然后又很快跳到下一个点。这其实就是在后台发生的事情:有些任务比其他任务花的时间长。但这没什么大不了的(除非这个任务真的很长,可能要几分钟?)。
当然,你可以使用线程。其实用队列和线程池来实现可能会很简单。比如说,运行20个线程,然后建立一个任务队列。你的进度就可以用队列中的项目数量来表示,队列的初始长度作为限制。这听起来是个不错的设计。