Python multiple threaded Prozesse für das Ausführen von ausführbaren Dateien

Ich versuche, ein Python-Skript zu aktualisieren, das eine ausführbare Datei auf Windows ausführt und die Textausgabedateien auf eine Version verwaltet, die mehrere Thread-Prozesse verwendet, so dass ich mehr als einen Kern nutzen kann. Ich habe vier separate Versionen der ausführbaren Datei, auf die jeder Thread zugreifen kann. Dieser Teil funktioniert gut. Wo ich Probleme habe, ist, wenn sie gleichzeitig laufen und versuchen, die (verschiedenen) Ausgabedateien zu öffnen, um sicherzustellen, dass sie korrekt laufen und je nach Inhalt der Ausgabedatei reagieren.

Im Einzelnen, beim Ausführen von drei Threads, werden zwei mit dem folgenden Fehler abstürzen, während man weiterhin arbeitet:

  • Python-Lookup-Hostname aus IP mit 1 Sekunde Timeout
  • Wie kann ich Python verwenden, um den System-Hostnamen zu erhalten?
  • Python socket.gethostbyname_ex () Multithread schlägt fehl
  • Extrahieren Sie den Domänennamen von einem Hostnamen
  • Validieren einer Hostname-Zeichenfolge
  • Exception in thread Thread-4: Traceback (most recent call last): File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner self.run() File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run conf = self.conf_file(Run) File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file l = open(self.run_dir(Run)+Run, 'r').readlines() #list of file lines IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile' 

    Dies ergibt sich aus dem Thread, der die ausführbare Datei nicht korrekt ausführt (dh warum "Path / to / Outputfile" nicht erstellt wurde und daher nicht gefunden werden kann). Aber einer der Fäden macht das richtig, während die beiden anderen nicht können. Gibt es einen Grund, warum ich nicht mehrere Threads mit verschiedenen Versionen einer ausführbaren Datei bekommen kann?

  • Wie mache ich Backslash (\) Arbeit in IDLE?
  • Mit Backslash in Python (nicht zu entkommen)
  • Warum erscheinen die Backslashs zweimal?
  • Übergeben von Meta-Zeichen an Python als Argumente aus der Befehlszeile
  • Warum benutzt PyCharm doppelten Backslash, um es zu entkommen?
  • Zweck eines Backslash am Ende einer Zeile
  • 2 Solutions collect form web for “Python multiple threaded Prozesse für das Ausführen von ausführbaren Dateien”

    Ich glaube nicht, dass GIL selbst das nicht selbst töten würde, es sei denn, eine Datei zu öffnen, bekommt man in eine seltsame Deadlock- oder Spinlock-Bedingung. Im Allgemeinen willst du Threads in solchen Fällen, wo du I / O-gebunden bist . In der Tat, die Tatsache, dass die Threads in der Lage sind, gleichzeitig zu laufen, trägt wahrscheinlich zu den anderen Threads fehl, anstatt erfolgreich eine Datei mehrmals zu öffnen.

    Auf der Folie fünfzehn dieser Präsentation, weist der Autor darauf hin, dass die GIL Releases auf blockieren I / O-Aufrufe, um anderen Threads eine Chance geben.

    Das eigentliche Problem hier scheint eine Sperre für eine Datei Ressource sein. Ich bin nicht wirklich sicher, wie Windows funktioniert, also kann ich nicht sprechen, warum dieser Fehler kriecht, aber es scheint, wie nur ein Thread hat tatsächlich eine Sperre auf eine Datei Ressource.

    Der Punkt des anderen Plakats über mehrere Kerne und die GIL könnte ins Spiel kommen, da man irgendeine Art von Prioritätsinversion haben könnte, wo die anderen beiden Fäden verhungert werden, aber ich finde es unwahrscheinlich, dass die obige Präsentation sagt, dass Threads In der Mitte eines Blockiervorgangs das Schloss für andere Fäden frei.

    Ein Gedanke ist, multiprocessing zu versuchen. Ich vermute, Sie haben viel Glück beim Lesen der Datei über mehrere Prozesse statt mit Threads.

    Hier ist ein Beispiel, das ich auf meinem OS 10.7.3-Rechner geschrieben und ausprobiert habe, es öffnet sich einen Datei- test dessen Inhalt lol\n :

     import multiprocessing import os def open_file(x): with open(x, 'r') as file_obj: return file_obj.readlines() a = multiprocessing.Pool(4) print a.map(open_file, ['test']*4) 

    Hier ist das Ergebnis, wenn ich es ausführen:

     ➜ ~ git:(master) ✗ python open_test.py [['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']] 

    Python kann derzeit nicht mehrfache Kerne ausnutzen, wegen der Global Interpreter Lock . Multithreading neigt dazu, mit Schwierigkeiten gefüllt zu sein, jedenfalls – besser, mehrere Prozesse zu verwenden, wenn man kann.

    Python ist die beste Programmiersprache der Welt.