0

こんにちは、さまざまなデータを調べて、そのデータの異常を見つけるプログラムがあります。プログラムを高速化するために、スレッド (合計 66) の使用を組み込みました。プログラムが異常を見つけたときに、それをファイルに書き込みたいのですが、複数のスレッド内からファイルに書き込もうとすると、書き込みません。 .

class myThread(threading.Thread):
    def __init__(self,arg1,arg2,lock,output):
        threading.Thread.__init__(self)
        self.arg1 = arg1
        self.arg2 = arg2
        self.lock = lock
        self.file = output
    def run(self):
        # print "Starting " + self.name
        main(self.arg1,self.arg2,self.lock,self.file)
        # print "Exiting " + self.name

def main(START_IP,END_IP,lock,File):
 # store found DNS servers
     foundDNS=[]

 # scan all the ip addresses in the range
     for i0 in range(START_IP[0], END_IP[0]+1):
        for i1 in range(START_IP[1], END_IP[1]+1):
           for i2 in range(START_IP[2], END_IP[2]+1):
               for i3 in range(START_IP[3], END_IP[3]+1):
                # build ip addres
                   ipaddr=str(i0)+"."+str(i1)+"."+str(i2)+"."+str(i3)

                   print "Scanning "+ipaddr+"...",
                   # scan address
                   ret=ScanDNS(ipaddr, 10)

              if ret==True:
                foundDNS.append(ipaddr)
                print "Found!"
                lock.acquire()
                File.write(ipaddr)
                File.write("\n")
                File.flush()
                lock.release()

            else:
                print 
file = open("file.txt","wb")
lock = threading.Lock() 
thread1 = myThread(START_IP,END_IP,lock,)
thread1.start()

これは、データを操作するための main に必要な引数だけを使用して、まったく同じ MyThread クラスを使用します。DNSサーバーをスキャンするコードを約1分間実行すると、おそらく20〜30のDNSサーバーがファイルに保存されるはずですが、通常は次のようになります。

ファイル.TXT

2.2.1.2
8.8.8.8
31.40.40
31.31.40.40
31.31.41.41

私は(スキャン出力を見たので)事実を知っており、それらすべてをほとんど書き込んでいないことを知っています。では、なぜ書き込みがあるものとないものがあるのでしょうか?

4

4 に答える 4

0

File Objects のドキュメントを確認してください。

File.flush()データがディスクに書き込まれることを保証するには十分ではありません os.fsync(File.fileno())。それを行うために直後に追加してください。

于 2014-06-01T13:34:43.060 に答える
0

コードが機能しない理由はわかりませんが、競合状態が原因であると推測できます。うまくいけば、知識のある人があなたの質問のその部分に答えることができます.

ただし、以前に同様の問題に遭遇したことがあり、ファイル書き込みコードを単一の出力スレッドに移動することで解決しました。このスレッドは、他のスレッドが書き込むデータをプッシュし た同期キューから読み取りました。

また、たまたま複数のコアを搭載したマシンで作業している場合は、 threadingの代わりにmultiprocessを使用することをお勧めします。後者は単一のコアでのみスレッドを実行しますが、前者にはこの制限はありません。

于 2013-08-02T06:03:36.467 に答える
0

ファイルを提供する代わりに、キューを提供します。新しいスレッドを作成してキューから読み取り、ファイルに書き込みます。または、一部の踏み板がデッドロックする可能性があるため、印刷物でもどこでもロックを使用します。

于 2013-08-02T06:04:23.857 に答える