Klasseninstanz an subprocess weiterreichen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Niun
User
Beiträge: 7
Registriert: Mittwoch 15. November 2006, 20:29

Freitag 12. Januar 2007, 09:26

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
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Freitag 12. Januar 2007, 10:01

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 12. Januar 2007, 10:13

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Niun
User
Beiträge: 7
Registriert: Mittwoch 15. November 2006, 20:29

Freitag 12. Januar 2007, 11:26

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 12. Januar 2007, 11:53

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Niun
User
Beiträge: 7
Registriert: Mittwoch 15. November 2006, 20:29

Freitag 12. Januar 2007, 12:18

Hmm, also doch eine Datenbank? Hab mich damit noch nicht so richtig auseinandergesetzt. Irgendwelche Empfehlungen?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 12. Januar 2007, 12:25

Weil es eine lokale Anwendung ist, würde ich SQLite nehmen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 12. Januar 2007, 16:22

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten