2012-04-10 4 views
2

Ich habe ein Python-Skript, das einen Web-Service-Anfrage-Arbeitsbereich überwacht. Jedes Mal, wenn ein Client einen Job an meinen Webdienst sendet, wird ein eindeutiger Jobordner an einem bekannten Speicherort erstellt. Ich habe ein Skript, das diesen bekannten Speicherort für einen Ordner abfragt, ohne eine "Markierung" (eine leere Textdatei mit einem spezifischen Namen, die anzeigt, dass die Verarbeitung für diesen Job abgeschlossen ist).Python-Worker-Skript aus Hauptscript als mehrere Instanzen aufrufen

Im Moment kann mein Skript ein Worker-Skript aufrufen, um den Inhalt des neuen Ordners zu verarbeiten, muss aber warten, bis das Worker-Skript fertig ist, bevor es mit der Übergabe von Ordnern fortfahren kann.

Meine Frage ist, was Optionen sind, um neue Instanzen des Worker-Skripts instatiated zu lassen und die Kontrolle an den Manager zurückgeben. Würde eine ausführbare Python-Datei erstellt, die Parameter des Worker-Skripts übernimmt und das Manager-Skript über die Befehlszeile aufrufen lässt? Oder würde das Worker-Skript zu einer Klasse werden, die zahlreiche Bearbeitungsvorgänge ausführen kann?

Sobald das Worker-Skript fertig ist, muss es nicht mehr zurück an den Manager-Skript-Auftrag gesendet werden. Dies geschieht über das Löschen einer Textdatei in das Verzeichnis. Obwohl ich jetzt darüber nachdenke, muss ich irgendwo festhalten, dass jedes Jobverzeichnis ausgegeben wurde, da es 1,5 Minuten dauert, bis das Worker-Skript verarbeitet wird.

Alle Ratschläge/Links würden sehr geschätzt werden.

Antwort

0

Zunächst stimme ich zu, dass Sie ein Flag in Ihre Verzeichnisse setzen müssen, das angibt, dass ein Verzeichnis verarbeitet wird. Das Master-Skript sollte die einzige sein, die das Flag setzt, oder Sie riskieren Race-Bedingungen (zwei Worker-Skripte, die dasselbe Verzeichnis zur selben Zeit verwenden). Sie können dieselbe Datei verwenden. Das Master-Skript erstellt es leer (bedeutet "in Bearbeitung") und das Worker-Skript schreibt 1B in es (was "erledigt" bedeutet). Auf diese Weise muss das Master-Skript nur die Existenz des Flags prüfen.

Zurück zu Ihrer Frage:

  • Sie tatsächlich Ihre Arbeiter Skript in ein eigenständiges Programm machen, und es über das subprocess Modul aufrufen;

  • können Sie es zu einem Thread machen (mit dem threading Modul [2]), , die etwas einfacher zu programmieren ist; Dies kann ineffizient sein wegen der GIL, aber wenn Ihr Worker-Skript hoch IO-gebunden ist, sollte es kein allzu großes Problem sein;

  • , wenn Sie Python 3 verwenden, können Sie an der multiprocessing Modul aussehen wollen [3]
    , die ich nie verwendet, aber scheint die Nutzbarkeit des Durchzugs zu mischen ohne störanfällige zum GIL ist; es scheint jedoch, dass es nicht vollständig tragbar ist.

this helps

  • [1] http://docs.python.org/library/subprocess.html
  • [2] http://docs.python.org/library/threading.html
  • [3] http://docs.python.org/dev/library/multiprocessing.html