3 Stimmen

Python-Dateiverarbeitung innerhalb von Threads

Hallo, ich habe ein Programm, das einen Datenbereich durchsucht und Anomalien in diesen Daten findet. Um mein Programm schneller zu machen, habe ich die Verwendung von Threads (insgesamt 66) integriert. Jetzt, wenn mein Programm die Anomalien findet, möchte ich, dass es sie in eine Datei schreibt. Wenn ich jedoch aus mehreren Threads in die Datei schreiben möchte, funktioniert es nicht. Hier ist ein Ausschnitt davon

Python:

import threading

class myThread(threading.Thread):
def __init__(self,lock,output):
    threading.Thread.__init__(self)
    self.lock = lock
    self.file = output
def run(self):
    main(self.lock,self.file)

def main(lock,file):
     lock.acquire()
     file.write("Es wird nicht geschrieben :(")
     lock.release

if __name__ == "__main__":
      lock = threading.Lock()
      file = open("file.txt","wb")
      thread1 = myThread(lock,file)
      thread1.start()

hier ist mein Code auf einer viel kleineren Skala. Meine Fehlermeldung besagt, dass die Datei nicht zum Schreiben geöffnet ist

EDIT: aus irgendeinem Grund funktioniert dieser Code, aber mein vollständiger Code scheint nicht zu funktionieren, also werde ich ihn posten

def main(START_IP,END_IP,lock,File):
  # speichere gefundene DNS-Server
  foundDNS=[]

  # durchsuche alle IP-Adressen im Bereich
  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):
                  # baue IP-Adresse auf
                  ipaddr=str(i0)+"."+str(i1)+"."+str(i2)+"."+str(i3)

                  print "Scan "+ipaddr+"...",
                  # scanne Adresse
                  ret=ScanDNS(ipaddr, 10)

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

                else:
                    print 

Dies verwendet genau dieselbe MyThread-Klasse, jedoch mit den erforderlichen Argumenten für main, um die Daten zu manipulieren. Wenn ich meinen Code für etwa eine Minute ausführe, während er über DNS-Server scannt, sollten vielleicht 20-30 DNS-Server in eine Datei gespeichert werden, aber normalerweise erhalte ich dies:

FILE.TXT

   2.2.1.2
   8.8.8.8
   31.40.40
   31.31.40.40
   31.31.41.41

Ich weiß mit Sicherheit (weil ich die Scan-Ausgabe beobachtet habe), dass dies kaum alle davon sind. Warum wird teilweise geschrieben und teilweise nicht?

3voto

RichieHindle Punkte 256891

Dies könnte ein Tippfehler sein, aber das hier:

lock.release

sollte Klammern haben:

lock.release()

Außerdem werden Ihre Schreibvorgänge gepuffert, bis zum ersten Zeilenumbruch oder flush().

0voto

sebdelsol Punkte 1044

Überprüfen Sie die Dokumentation für Dateiobjekte:

flush() schreibt die Daten der Datei nicht unbedingt auf die Festplatte. Verwenden Sie flush() gefolgt von os.fsync(), um dieses Verhalten sicherzustellen.

File.fileno() gibt die Dateideskriptor zurück, der von os.fsync() benötigt wird:

with lock:
    File.write(ipaddr)
    File.write("\n")
    File.flush()
    os.fsync(File.fileno())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X