Hi Zusammen,
hat jemand ne Ahnung wie ich einige Prozessen parallel ausführen kann ?
Aktuell arbeitet das Skript seriel. Eine Parellisierung sollte die Laufzeit verkürzen.
Aktuell arbeitet das Skript seriel. Eine Parellisierung sollte die Laufzeit verkürzen.
if Utils.parseBool(self.upgradeDB_aktiv):
self._executeBpsScript('upgradeDb')
self._executeBpsScript('amendDbSetup')
self._executeBpsScript('preParameterTask')
if Utils.parseBool(self.copyMandant_aktiv): self._executeBpsScript('CopyMandant')
self._executeBpsScript('upgradeParameter')
if Parameters.getTestConfiguration('Lauftyp').lower() == 'wartungslauf':
self._executeBpsScript('amendParameter', overwriteEnv={'TEST_UMGEBUNGSSKRIPT': 'testscripts/TEST_AmendParametersForEnvironment/src/etc/Update_WARTUNG.sql'})
else:
self._executeBpsScript('amendParameter')
self._activateArchivSchema()
self._executeBpsScript('generierungsKz')
self._executeBpsScript('validateParameter')
self._executeBpsScript('postParameterTask')
self._executeBpsScript('StdRepCreateLEmanuelleKorrekturen')
self._executeBpsScript('StdRepRefreshLEmanuelleKorrekturen')
self._executeBpsScript('StdRepCreateMQTs')
if Utils.parseBool(Parameters.getTestConfiguration('Archivschema_Aktiv')):
self._executeBpsScript('upgradeArchivDb')
self._executeBpsScript('amendArchivDbSetup')
self._executeBpsScript('preArchivParameterTask')
if Utils.parseBool(self.copyMandant_aktiv): self._executeBpsScript('CopyMandant_Archiv')
self._executeBpsScript('upgradeArchivParameter')
self._executeBpsScript('postArchivParameterTask')
die letzte Block Grün hätte ich parallel ausführen mit der Erste Block !
ich freu mich sehr auf Antworten und danke
PARALLELVERARBEITUNG
- noisefloor
- User
- Beiträge: 4158
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Python kennt das `multiprocessing` und das `concurrent.futures` Modul. Letzteres erlaubt auch das Starten von mehreren Prozessen via multiprocessing, hat aber eine "higher level" API.
Damit das eine oder das andere echt parallel läuft, brauchst du aber natürlich eine Mehrkern-CPU.
Und mehrere Prozesse bringen nur was, wenn dein Problem "CPU-bound" ist, also die CPU der limitierende Faktor ist. Dein Skript scheint aber in erster Linie Datenbankzugriffe zu machen?
Gruß, noisefloor
Python kennt das `multiprocessing` und das `concurrent.futures` Modul. Letzteres erlaubt auch das Starten von mehreren Prozessen via multiprocessing, hat aber eine "higher level" API.
Damit das eine oder das andere echt parallel läuft, brauchst du aber natürlich eine Mehrkern-CPU.
Und mehrere Prozesse bringen nur was, wenn dein Problem "CPU-bound" ist, also die CPU der limitierende Faktor ist. Dein Skript scheint aber in erster Linie Datenbankzugriffe zu machen?
Gruß, noisefloor
Hi noisefloor,
danke für deine Antwort. Genau es wird versucht mehrere Skripten nacheinandere auszuführen. Erstens wird zu DB zugriffen dann erfolgt die nächsten Skripten. Alle Skripten arbeiten seriel. Nun möchte ich die Skripten mit Ziel Archivierung Parallel mit der zugehörigen Skripten ausführen. Das heißt ich habe ein paar Optionen das zu machen aber ich bin immer noch nicht sicher , welche Option bestens verwendet werden kann.
Option1 :
die Archivierung Skripten im Hintergrund ausführen per "Skript_Name &" => mit & Aufruf wird die Skript im Hintergrund ausgeführt.
Option2: per Multiprocessing oder Multithreading.
ich habe noch keine Ahnung wie das man umsetzen kann !
viele Grüße
ABE
danke für deine Antwort. Genau es wird versucht mehrere Skripten nacheinandere auszuführen. Erstens wird zu DB zugriffen dann erfolgt die nächsten Skripten. Alle Skripten arbeiten seriel. Nun möchte ich die Skripten mit Ziel Archivierung Parallel mit der zugehörigen Skripten ausführen. Das heißt ich habe ein paar Optionen das zu machen aber ich bin immer noch nicht sicher , welche Option bestens verwendet werden kann.
Option1 :
die Archivierung Skripten im Hintergrund ausführen per "Skript_Name &" => mit & Aufruf wird die Skript im Hintergrund ausgeführt.
Option2: per Multiprocessing oder Multithreading.
ich habe noch keine Ahnung wie das man umsetzen kann !
viele Grüße
ABE
- __blackjack__
- User
- Beiträge: 13931
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Im simpelsten Fall und wenn Ausnahmebehandlung egal ist, könnte man die beiden Blöcke in Methoden stecken und die nebenläufig ausführen lassen:
Code: Alles auswählen
from concurrent.futures import ProcessPoolExecutor
# ...
def _executeBpsScripts(self, names, overwriteEnv=None):
for name in names:
self._executeBpsScript(name, overwriteEnv)
def _good_name_for_first_block(self, Parameters):
if Utils.parseBool(self.upgradeDB_aktiv):
self._executeBpsScript("upgradeDb")
self._executeBpsScripts(["amendDbSetup", "preParameterTask"])
if Utils.parseBool(self.copyMandant_aktiv):
self._executeBpsScript("CopyMandant")
self._executeBpsScript("upgradeParameter")
if (
Parameters.getTestConfiguration("Lauftyp").lower()
== "wartungslauf"
):
self._executeBpsScript(
"amendParameter",
overwriteEnv={
"TEST_UMGEBUNGSSKRIPT": (
"testscripts/TEST_AmendParametersForEnvironment"
"/src/etc/Update_WARTUNG.sql"
)
},
)
else:
self._executeBpsScript("amendParameter")
self._activateArchivSchema()
self._executeBpsScripts(
[
"generierungsKz",
"validateParameter",
"postParameterTask",
"StdRepCreateLEmanuelleKorrekturen",
"StdRepRefreshLEmanuelleKorrekturen",
"StdRepCreateMQTs",
]
)
def _good_name_for_second_block(self, Parameters):
if Utils.parseBool(
Parameters.getTestConfiguration("Archivschema_Aktiv")
):
self._executeBpsScripts(
[
"upgradeArchivDb",
"amendArchivDbSetup",
"preArchivParameterTask",
]
)
if Utils.parseBool(self.copyMandant_aktiv):
self._executeBpsScript("CopyMandant_Archiv")
self._executeBpsScripts(
["upgradeArchivParameter", "postArchivParameterTask"]
)
def some_method(self, Parameters):
with ProcessPoolExecutor(2) as pool:
for method in [
self._good_name_for_first_block,
self._good_name_for_second_block,
]:
pool.submit(method, Parameters)
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware