0

再び私からの質問..いくつかの問題が再び発生しています。もっと賢くてこれを知っている人を見つけたい.. :D

現在、(1,1000) の範囲のスレッド URL を開くと、実際にすべての異なる URL を表示したいというスレッドの問題が発生しています。コードを実行したときにのみ、多くの double 変数を取得します (おそらく、クロールが高速になるためです)。とにかく、これは私のコードです。どのスレッドにあるかを確認しようとしましたが、2倍になります。

import threading
import urllib2
import time
import collections

results2 = []
def crawl():
    var_Number = thread.getName().split("-")[1]
    try:
        data = urllib2.urlopen("http://www.waarmaarraar.nl").read()
        results2.append(var_Number)
    except:
        crawl()

threads = []

for n in xrange(1, 1000):
    thread = threading.Thread(target=crawl)
    thread.start()  
    threads.append(thread)

# to wait until all three functions are finished
print "Waiting..."

for thread in threads:
    thread.join()

print "Complete."

# print results (All numbers, should be 1/1000)
results2.sort()
print results2    
# print doubles (should be [])
print [x for x, y in collections.Counter(results2).items() if y > 1]

ただし、xrange 行の直下に time.sleep(0.1) を追加すると、それらの double は発生しません。これは私のプログラムを大幅に遅くしますが。これを修正するより良い方法を知っている人はいますか?

4

2 に答える 2

0

crawl()例外ハンドラーにへの再帰呼び出しがあります。エラーが発生した場合、同じスレッドが関数を数回実行します。したがって、同じものが数回results2含まれる場合があります。var_Number追加した場合time.sleep(.1)(一時停止); スクリプトが消費するリソースが少なくなります。たとえば、開いているfdsの数、実行中のスレッド、リモートサーバーへのリクエストが成功する可能性が高くなります。

また、デフォルトのスレッド名が繰り返される場合があります。スレッドが終了した場合。たとえば、実装が.ident属性を使用して名前を生成する場合、別のスレッドが同じ名前を持つ可能性があります。

ノート:

于 2012-10-09T22:06:37.467 に答える
0

Thread.getName()に関するドキュメントによると、これは正しい動作です。

各スレッドに一意の名前が必要な場合は、name 属性を使用して設定する必要があります。

最終的に期待するものに基づいて、置き換えます

for n in xrange(1, 1000):
    thread = threading.Thread(target=crawl)
    thread.start()  
    threads.append(thread)

for n in xrange(1, 1000):
    thread = threading.Thread(target=crawl)
    thread.name = n
    thread.start()  
    threads.append(thread)

とあなたvar_Number = thread.getName().split("-")[1]var_Number = thread.name助けるはずです。

EDIT
いくつかのテストの後、ユーザーカスタム名は別のスレッドで再利用できるため、渡す唯一の方法はまたはのnを使用することです。 この動作は理にかなっています。スレッドで何らかのデータを使用する必要がある場合は、それを正しく渡し、属していない場所に配置しようとしないでください。argskwargsthreading.Thread()

于 2012-10-09T21:59:50.730 に答える