2

インターネットから数十から数百のサムネイルを表示する必要があるPygletでGUI アプリを作成しています。現在、urllib.urlretrieveを使用してそれらを取得していますが、これは完了するまで毎回ブロックされ、一度に 1 つだけ取得されます。

それらを並行してダウンロードし、GUI をブロックすることなく、完了したらすぐにそれぞれを表示することをお勧めします。これを行う最善の方法は何ですか?

スレッドについてはよくわかりませんが、threadingモジュールが役に立ちそうですか? あるいは、私が見落としている簡単な方法があるかもしれません。

4

6 に答える 6

3

threadingまたはmultiprocessingモジュールの恩恵を受けるでしょう。これらすべてのベースのクラスを実際に自分で作成する必要はありません。次Threadを使用したより簡単な方法がありますPool.map

from multiprocessing import Pool

def fetch_url(url):
    # Fetch the URL contents and save it anywhere you need and
    # return something meaningful (like filename or error code),
    # if you wish.
    ...

pool = Pool(processes=4)
result = pool.map(f, image_url_list)
于 2009-06-11T21:58:55.457 に答える
2

ご想像のとおり、これはスレッド化に最適な状況です。これは、Python で自分自身の最初のスレッド化を行うときに非常に役立つ短いガイドです。

于 2009-06-11T19:44:41.737 に答える
2

あなたが正しく示したように、それぞれが urlretrieve 操作の実行を担当する多数のスレッドを作成できます。これにより、メイン スレッドは中断されることなく続行できます。

Python でのスレッド化に関するチュートリアルは次のとおりです: http://heather.cs.ucdavis.edu/~matloff/Python/PyThreads.pdf

于 2009-06-11T19:45:06.447 に答える
2

threading.Thread の使用例を次に示します。クラス名を独自のものに、run 関数を独自のものに置き換えるだけです。スレッド化は、IO が制限されたアプリケーションに最適であり、実際に高速化できることに注意してください。標準の python での計算に厳密に pythong スレッドを使用しても、一度に 1 つのスレッドしか計算できないため、役に立ちません。

import threading, time
class Ping(threading.Thread):
    def __init__(self, multiple):
        threading.Thread.__init__(self)
        self.multiple = multiple
    def run(self):
        #sleeps 3 seconds then prints 'pong' x times
        time.sleep(3)
        printString = 'pong' * self.multiple

pingInstance = Ping(3)
pingInstance.start() #your run function will be called with the start function
print "pingInstance is alive? : %d" % pingInstance.isAlive() #will return True, or 1
print "Number of threads alive: %d" % threading.activeCount()
#main thread + class instance
time.sleep(3.5)
print "Number of threads alive: %d" % threading.activeCount()
print "pingInstance is alive?: %d" % pingInstance.isAlive()
#isAlive returns false when your thread reaches the end of it's run function.
#only main thread now
于 2009-06-11T20:01:03.053 に答える
1

次の選択肢があります。

  • スレッド: 最も簡単ですが、スケーリングがうまくいきません
  • ツイスト: 中程度の難易度で、スケーリングは良好ですが、GIL とシングル スレッドにより CPU を共有します。
  • マルチプロセッシング: 最も難しい。独自のイベント ループを作成する方法を知っていれば、適切にスケーリングできます。

産業規模のフェッチャーが必要でない限り、スレッドのみを使用することをお勧めします。

于 2009-06-11T22:55:42.183 に答える
0

スレッドを使用するか、Twistedなどの非同期ネットワーク ライブラリを使用する必要があります。特定のユースケースでは、スレッドを使用する方が簡単かもしれないと思います。

于 2009-06-11T22:34:35.620 に答える