1

私はlist1 日あたり約 50k の ID で構成されています。

loopそして、サーバーに 1 日あたり 50,000 のリクエストを送信する必要があります { サーバーは同じ都市にあります } 。情報を取得してデータベースに保存しますThreads 。取得と保存を停止する時間の...

私のコードフラグメントを見てください

import re,urllib,urllib2
import mysql.connector as sql
import threading
from time import sleep
import idvalid

conn = sql.connect(user="example",password="example",host="127.0.0.1",database="students",collation="cp1256_general_ci")
cmds = conn.cursor()

ids=[] #here is going to be stored the ID's

def fetch():
    while len(ids)>0:#it will loop until the list of ID's is finish 
        try:
            idnumber = ids.pop()
            content = urllib2.urlopen("http://www.example.com/fetch.php?id="+idnumber,timeout=120).read()
            if content.find('<font color="red">') != -1:
                    pass
            else:
                    name=content[-20:]
                    cmds.execute("INSERT INTO `students`.`basic` (`id` ,`name`)VALUES ('%s', '%s');"%(idnumber,name))
        except Exception,r:
            print r,"==>",idnumber
            sleep(0.5)#i think sleep will help in threading ? i'm not sure
            pass
        print len(ids)#print how many ID's left

for i in range(0,50):#i've set 50 threads
    threading.Thread(target=fetch).start()

output: 残りの ID の数を出力し続け、不明な時点で、出力とフェッチと保存を停止します

4

1 に答える 1

1

ネットワークとスレッドはどちらも自明ではありません...ほとんどの場合、スレッドがハングするネットワーク イベントが原因です。私はスレッドが応答しなくなるという同じ問題に苦しんでいるので、人々がこれに対する解決策を持っているかどうか聞いてみたいと思います.

しかし、あなたのコードで間違いなく変更したいことがいくつかあります。

  • 「例外」をキャッチすることはありません。対処方法を知っている例外をキャッチするだけです。スレッドの 1 つでネットワーク エラーが発生した場合、ID をあきらめずに再試行できます。
  • コードに競合状態があります。最初に残りのコンテンツがあるかどうかを確認してから、それを取り出します。2 番目の時点で、残りの作業が消失し、例外が発生する可能性があります。これを修正するのが難しい場合は、競合状態やデッドロックなしでスレッド間でオブジェクトを渡すことを目的とした優れた Python オブジェクトがあります: Queue オブジェクトです。見てみな。
  • 「sleep(0.5)」は一般的にスレッド化に役立っていません。必要ないはずです。競合状態が発生する可能性を減らすことができますが、競合状態を完全になくすようにプログラムすることをお勧めします。一方、50 スレッドを全速力で使用して Web サーバーを攻撃することは、あまり友好的ではないかもしれません。サービスが提供できる範囲内にとどまるようにしてください。
于 2012-11-10T16:11:04.310 に答える