0

一度に複数のファイルをダウンロードする方法として、スレッドの実験を始めたところです。私の実装では、thread.start_new_thread() を使用しています。

一度に 10 個のファイルをダウンロードし、10 個のファイルすべてのダウンロードが完了するまで待ってから、次の 10 個のファイルを開始したいと考えています。以下の私のコードでは、download() が exit()、sys.exit()、または return で終了しても、threading.activeCount() が減少することはありません。

私の回避策は、downloadsRemaining カウンターを導入することでしたが、アクティブなスレッドの数が増え続けています。以下のサンプル プログラムの最後には、500 のアクティブなスレッドがありますが、実際には一度に 10 だけが必要です。

import urllib
import thread
import threading
import sys

def download(source, destination):

    global threadlock, downloadsRemaining

    audioSource = urllib.urlopen(source)
    output = open(destination, "wb")
    output.write(audioSource.read())
    audioSource.close()
    output.close()

    threadlock.acquire()
    downloadsRemaining = downloadsRemaining - 1
    threadlock.release()

    #exit()
    #sys.exit()    None of these 3 commands decreases threading.activeCount()
    #return


for i in range(50):
    downloadsRemaining = 10
    threadlock = thread.allocate_lock()

    for j in range(10):
        thread.start_new_thread(download, (sourceList[i][j], destinationList[i][j]))

    #while threading.activeCount() > 0:  <<<I really want to use this line rather than the next
    while downloadsRemaining > 0:
        print "NUMBER ACTIVE THREADS:  " + str(threading.activeCount())
        time.sleep(1)
4

1 に答える 1

0

ドキュメントによると:

新しいスレッドを開始し、その識別子を返します。スレッドは、引数リスト args (タプルでなければなりません) を使用して関数 function を実行します。オプションの kwargs 引数は、キーワード引数の辞書を指定します。関数が戻ると、スレッドはサイレントに終了します。関数が未処理の例外で終了すると、スタック トレースが出力され、スレッドが終了します (ただし、他のスレッドは引き続き実行されます)。

(強調を追加しました。)

そのため、関数が戻ったときにスレッドを終了する必要があります。

于 2012-12-10T20:31:18.270 に答える