Seite 1 von 1

Klasseninstanz an subprocess weiterreichen?

Verfasst: Freitag 12. Januar 2007, 09:26
von Niun
Hallo,

Ich möchte in einem Python Script, was mit subprocess gestartet wurde eine Objektinstanz benutzen, die im Elternprozess existiert. Ist das möglich, ohne das Objekt zu kopieren?

Um das Problem etwas näher zu beschreiben:
Momentan habe ich einen kleinen HTTPServer mit CGIHTTPRequestHandler und rufe in einem cgi-Script eine Funktion von einem Python-Modul auf, die ein Pickle-File lädt und Daten daraus zurückgibt, die ich mit meinem cgi-Script ausgebe.
Blöderweise ist das Pickle-File recht groß und das laden (was bei jedem Start des cgi-Scripts durchgeführt werden muss) dauert recht lange.
Meine Idee war jetzt, das Pickle-File beim Start des Servers einmal zu laden, und irgendwie von dem cgi-Script darauf zu zugreifen. Ich könnte dem cgi-Script auch Strings durch eine Pipe schicken, aber dazu müsste ich die HTTP GET strings, die im Browser eingegeben wurden, im Server verarbeiten um die richtigen Daten auswählen zu können, die ich an das cgi-Script schicke.

Gruß Niun

Ein paar Gedanken

Verfasst: Freitag 12. Januar 2007, 10:01
von sunmountain
Das Problem ist, das ein CGI Skript gestartet und dann beendet wird;
in der Regel wird es via fork() oder exec() irgendwas ausgeführt,
was bedeutet, das es keinen Zugriff auf die Internas des Webservers hat.
Insofern gibt es relativ wenig Möglichkeiten.
Meine Frage dazu wäre, wie groß das Pickle File ist, und was für Daten
es enthält.

Wenn es mehrere MB sind, bedeutet das natürlich auch, das Dein CGI Prozess immer groß wird (Python Interpreter + Runtime + Pickle Daten).
Eventuell kannst Du die Daten in eine Datenbank auslagern,
oder Due schreibst einen eigenen Prozess der eine Pipe bereitstellt,
von der die CGI's die Daten lesen können.

Wie gesagt, nach dem Start des CGI hat der Childprozess nur noch die Möglichkeit per IPC mit dem Elternprozess zu kommunizieren.

Bei Threads sähe das anders aus.
Ob es dann Möglichkeiten gibt, hängt von der internen Implementation
der HTTPServer Klassen ab, die ich nicht kenne.

Verfasst: Freitag 12. Januar 2007, 10:13
von jens
Wenn es keine Produktive Umgebung ist, wofür IMHO der CGIHTTPRequestHandler auch nicht geeignet ist, dann kannst du den Entwicklungsserver von colubrid nehmen. Dabei wird deine WebApp nicht bei jedem Request neu gestartet. Ist ähnlich wie fastCGI/mod_Python...

Verfasst: Freitag 12. Januar 2007, 11:26
von Niun
Erstmal danke für die schnellen Antworten!

Also mein Pickle-File ist ca 80 MB groß, das dauert schon 30s, um es zu laden.

Das cgi-Script rufe nur ich in meinem lokalen Netz auf, um mit einem Webinterface auf index Daten auf einem anderen Rechner zugreifen zu können. Diese Indexdaten sind in dem Pickle-File in form von ineinander verschachtelten Dictionarys und Listen gespeichert.

Das ganze Dictionary aus dem Pickle-File permanent im Speicher zu haben, wär kein großes Problem, problematisch ist nur, dass es bei jeder HTTP-GET Abfrage von dem cgi-Skript neu geöffnet werden muss.
Eventuell kannst Du die Daten in eine Datenbank auslagern,
oder Due schreibst einen eigenen Prozess der eine Pipe bereitstellt,
von der die CGI's die Daten lesen können.
Datenbank: Hmm, das könnte bei der Datenstruktur kompliziert werden.
Ja, bei dem Prozess mit der Pipe müsste ich halt wie gesagt die Suchbegriffe, die ich in der Webmaske angebe von dem Server an den Prozess, der Die Daten bereit hält schicken, damit der dann die richtigen Daten für das CGI-Script zur verfügung stellt. Aber ich weiss nicht, wie ich das machen soll.
Bei Threads sähe das anders aus.
Also das CGI-Script könnte ich in einem Thread starten. Und ich könnte auch einen weiteren starten, der die Daten bereit hält. Wie könnte ich dann die Daten von dem CGI-Thread von dem Daten-Thread abfragen?
Wenn es keine Produktive Umgebung ist, wofür IMHO der CGIHTTPRequestHandler auch nicht geeignet ist, dann kannst du den Entwicklungsserver von colubrid nehmen. Dabei wird deine WebApp nicht bei jedem Request neu gestartet. Ist ähnlich wie fastCGI/mod_Python...
Nö, nur für Private spielereien mehr oder weniger. Hört sich interessant an, muss ich mir mal ansehen.

Verfasst: Freitag 12. Januar 2007, 11:53
von jens
80MB! Das muß auf jeden Fall in eine DB rein!

Du musst dir überlegen, welche Datensätze du immer aus den gesamten Daten brauchst und das dann gescheit auf Tabellen/Zeilen/Spalten aufteilen...

Wenn du es dir einfach machen willst, kannst du es auch so machen das du immer einen Datensatz mit pickle serialisierst und den dann in einer Tabellen-Spalte mit "Metadaten" ablegst...

Verfasst: Freitag 12. Januar 2007, 12:18
von Niun
Hmm, also doch eine Datenbank? Hab mich damit noch nicht so richtig auseinandergesetzt. Irgendwelche Empfehlungen?

Verfasst: Freitag 12. Januar 2007, 12:25
von jens
Weil es eine lokale Anwendung ist, würde ich SQLite nehmen...

Verfasst: Freitag 12. Januar 2007, 16:22
von Leonidas
jens hat geschrieben:Weil es eine lokale Anwendung ist, würde ich SQLite nehmen...
Wenn es keine ist, würde ich PostgreSQL nehmen ;)

Nein, es hängt auch ab, was du für Bedürfnisse hast, kann auch sein, dass ZODB oder Durus für dich angemessen wären.