AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Mehrfachausführung eines CGI
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrfachausführung eines CGI

Ein Thema von Lemmy · begonnen am 5. Jul 2013 · letzter Beitrag vom 7. Jul 2013
Antwort Antwort
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mehrfachausführung eines CGI

  Alt 5. Jul 2013, 22:22
Hallo,

CGI mit Delphi 7, läuft unter IIS (Windows Server 2003). Laufzeit ist teilweise über eine Stunde (Datenimport).

Nun ist es so, dass genau nach einer Stunde eine weitere Instanz der CGI startet, ohne dass der Anwender am Browser (IE) irgend etwas unternimmt (festgestellt durch die Protokollierung in einer Datenbank).

Ich bin jetzt hergegangen und habe in das CGI einen Mutex eingebaut, der die Mehrfachausführung unterdrücken soll. Wenn ich das in der Konsole teste funktioniert das wunderbar. Wenn ich im Browser 2 Tabs öffne und in jedem das CGI kurz nacheinander starte passiert folgendes: Der erste CGi-Aufruf wird abgearbeitet und so lange der läuft wird der Aufruf des zweiten Registers "zurückgehalten". Erst wenn der Lauf des CGI im Tab1 fertig ist, startet der CGI Aufruf des zweiten Tab!

Nur wenn ich innerhalb eines Tab das CGI kurz nacheinander starte erhalte ich die gewünschte Fehlermeldung. Das würde mir erst mal für die Geschichte oben ausreichen, dennoch wüsste ich gerne woher das Verhalten mit den beiden Tabs kommt.

Hat jemand von euch nen Plan was da abgeht? Ach ja: Das Verhalten kann ich so auch unter Apache (2.2) und anderen Browsern nachvollziehen.

Danke
Lemmy
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Mehrfachausführung eines CGI

  Alt 5. Jul 2013, 22:38
Das ist doch bei CGI ganz normal dass es mehrere Instanzen der gleichen CGI.exe geben kann.
Zitat:
und habe in das CGI einen Mutex eingebaut, der die Mehrfachausführung unterdrücken soll
Was stört dich an den mehreren Instanzen?
Dein Mutex begrenzt die Skalierbarkeit.
fork me on Github
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Mehrfachausführung eines CGI

  Alt 6. Jul 2013, 19:26
Hi,

generell hast Du natürlich recht, allerdings geht es hier wie oben beschrieben um ein CGI das einen Datenimport durchführt. Und wenn man den mehrfach mit den selben Daten auf der selben Datenbank ausführen lässt, dann wird die Performance davon eher negativ beeinträchtigt.
deshalb soll das Teil auf einer Datenbank eben nur einmal zur selben Zeit laufen.

Grüße
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Mehrfachausführung eines CGI

  Alt 6. Jul 2013, 20:32
Hallo,

ich gehe davon aus, dass der Mutex nur innerhalb der Session gültig ist, in der das CGI-Programm gestartet wurde. Hast Du zwei Tabs, sind es (vermutlich) zwei Sessions, die sich untereinander nicht sehen.

Das ist jetzt zugegeben nur reines Spekulatius von mir.

Alternative Lösung:

Das CGI schreibt in eine Datei, Datenbank... hinein, dass es läuft und entfernt diesen Eintrag beim Beenden. Beim Start prüft es zuerst, ob es diesen Eintrag gibt, wenn ja, beendet es sich (mit entsprechender Meldung als HTML-Seite?).

Auf die Existenz einer Datei zu prüfen, dürfte hier die "billigste" Lösung sein, da nur ca. 3 bis 5 Zeilen Quelltext erforderlich sind.

Problem dabei:

Sollte das Programm sich mal nicht korrekt beenden, bleibt der Eintrag bestehen und es erfolgt kein erneuter Start des Programmes, bis eine manuelle Bereinigung erfolgte.

Dieses Problem kann aber auch bei funktionierendem Mutex auftreten, wenn das Programm diesen zwar setzen kann, aber dann abraucht. Der Mutex bleibt auch dann bestehen.

In dem Fall ist das Wegräumen einer überflüssigen Datei aber einfacher.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Mehrfachausführung eines CGI

  Alt 6. Jul 2013, 21:15
Hallo,

ich gehe davon aus, dass der Mutex nur innerhalb der Session gültig ist, in der das CGI-Programm gestartet wurde. Hast Du zwei Tabs, sind es (vermutlich) zwei Sessions, die sich untereinander nicht sehen.
Ok, was aber nicht erklärt weshalb im zweiten Tab die Ausführung des CGi solang angehalten wird, bis das cgi im ersten Tab fertig ist. Vielleicht noch zur Klarstellung: Das passiert auch ohne einen aktiven Mutex-Code!

Dein Vorschlag über eine Lock-Datei bzw. Eintrag in einer Datenbank wäre in dem Fall eine gute Lösung. Die Nachteile sind mir so weit bekannt.

Grüße
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Mehrfachausführung eines CGI

  Alt 6. Jul 2013, 22:10
Ok, was aber nicht erklärt weshalb im zweiten Tab die Ausführung des CGi solang angehalten wird, bis das cgi im ersten Tab fertig ist. Vielleicht noch zur Klarstellung: Das passiert auch ohne einen aktiven Mutex-Code!
Könnte es sein, dass der/die Webserver ein CGI-Programm nicht zeitgleich zweimal laufen lassen?
Oder dass das zweite CGI-Programm nicht auf die Datenbank zugreifen kann und deshalb wartet?
Ersteres müsste dann auch passieren, wenn Du eine dateibasierte "Doppeltenprüfung" implementierst, was dann für Deine Problemlösung leider kontraproduktiv wäre.
Ist die Datenbank das Problem, müssten auch mehrere CGI-Programme gleichzeitig laufen können, da weitere CGI-Programm ja nicht mehr auf die Datenbank zugreifen.

Wenn das erste CGI-Programm läuft, sind dann weitere Zugriffe, die nicht eine zweite Instanz das CGI-Programmes betreffen, möglich? Oder blockiert das erste CGI-Programm den Webserver?

Gleiches Verhalten, wenn das erste CGI-Programm aus dem IE angetriggert wird und das zweite aus dem Firefox? Oder tritt das "Phänomen" nur auf, wenn mehrere Aufrufe über mehrere Tabs eines Browsers erfolgen? Kannst Du die Aufrufe des CGI-Programmes im Log der Webserver sehen? Oder erscheint der zweite Aufruf dort erst, wenn das erste Programm beendet wurde?

Wenn ich das recht beobachtet habe, lassen Browser (protokollbedingt?) nur eine begrenzte Anzahl von Zugriffen auf einen Webserver zeitgleich zu, ist also sicher, dass der zweite Aufruf des CGI-Programmes beim Webserver ankommt, bevor das erste CGI-Programm beendet wurde?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz