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 に答える