PARALLELVERARBEITUNG

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
ABE
User
Beiträge: 2
Registriert: Mittwoch 15. Juli 2020, 15:11

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
Benutzeravatar
noisefloor
User
Beiträge: 3829
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
ABE
User
Beiträge: 2
Registriert: Mittwoch 15. Juli 2020, 15:11

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
Benutzeravatar
__blackjack__
User
Beiträge: 12984
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)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten