Script zusammen mit Zope Starten

Django, Flask, Bottle, WSGI, CGI…
Antworten
woolfy
User
Beiträge: 19
Registriert: Montag 6. Februar 2006, 15:14
Wohnort: Stuttgart

Hallo zusammen,

hat jemand eine Idee, wie ich am Besten ein Script zusammen mit einer ZopeInstanz starte?
Gibt es irgendeine Art init-hook?

Ich erklär mal was ich damit bezwecken möchte:
Ich habe ein Produkt, das als eine Art Dienst in einer Endlosschleife mit sleep()'s in einer Zopeinstanz laufen soll.
Nun wäre es ja kein Problem, den Dienst bei einem kontrollierten Start der Instanz (per cronjob) mit einigen Sekunden Verzögerung mit zu starten, aber was ist wenn die Insanz soft neu gestartet wird?
Der laufende "Dienst" wird auch beendet, wenn das Produkt refreshed wird, ich nehme mal an, da das Produkt dabei aus dem Speicher "entladen" wird...

Schön wäre ja irgend ein Ansatz im Produkt selbst __getstate__ oder so.
Dieser dürfte aber nur greifen, wenn das Produkt neu geladen wird...

Ist klar, was ich meine?

Danke schonmal
Gruß
Jens
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

woolfy hat geschrieben:hat jemand eine Idee, wie ich am Besten ein Script zusammen mit einer ZopeInstanz starte?
Gibt es irgendeine Art init-hook?
[...]
Ist klar, was ich meine?
Hi Jens!

Nein, es ist nicht wirklich klar. Entweder du hast ein Produkt das **IN** der Zope-Instanz läuft, dann kann es kein Dienst sein. Oder du hast einen Dienst der **unabhängig** von einer Zope-Instanz läuft. Beides gemeinsam geht nicht. Wenn dein Programm mit "Sleep" arbeitet, dann würde ich es niemals in die Zope-Instanz ingegrieren. Warum ist es überhaupt so wichtig, dass der *Dienst* mit Zope neu gestartet wird? Warum kann der Dienst nicht einfach unabhängig zur Zope-Instanz laufen und bedient die Zope-Instanz z.B. mit XMLRPC?

Jedes Zope-Produkt wird beim Starten von Zope importiert und damit ausgeführt. Wenn du also ein einfaches Zope-Produkt schreibst, dann kannst du dir sicher sein, dass du es mitbekommst, wenn die Zope-Instanz gestartet wird. Du kannst also dort etwas starten, was dann aber auch unabhängig weiterlaufen muss, denn so etwas wie ein "sleep" ist nicht unbedingt ideal für eine Webanwendung.

Vielleicht hilft es schon, wenn du uns hier erklärst, was du tun möchtest. Vielleicht gibt es einen besseren Weg dafür.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
woolfy
User
Beiträge: 19
Registriert: Montag 6. Februar 2006, 15:14
Wohnort: Stuttgart

Hi Gerold,

komm leider erst jetzt zum Antworten.

...ein unabhängig laufender Dienst, in einem eigenen Thread...
Das hört sich doch schön an :)

(Bei dem *Dienst* handelt es sich um ein Synchronisations-Tool.)
Leider hatte ich diverse Probleme die Sync in einem eigenen Thread zum laufen zu bringen (konkurierende Zugriffe, Zopes Transaktionssystem, u.s.w). Hab noch nicht all zu viel Erfahrung mit threading und als dann plötzlich auch noch meine DB "corrupted" war (frag mich nicht wie ^^), hatte ich erstmal keine Lust mehr.

Ich werde das Thema später mit Python 2.4+ wieder aufgreifen, bin derzeit noch auf Zope 2.5.1 und Python 2.1.3 angewiesen :(.

Die Sync rufe ich ja mittels cronjob bzw. xmlrpclib auf, jeweils mit nem kurzen Timeout.
Wenn ich das richtig verstanden habe, läuft die Sync dann durch den Publisher in einem (von Zopes) Threads.

Hab's jetzt so gelöst, dass __init__.py ein file schreibt, aufgrund dessen die vom cronjob aufgerufene Methode weiß, dass sie die Sync neu starten soll.
Also von hinten ans Auge, aber es funktioniert zuverlässig.

Danke Dir trotzdem vielmals!
Hab durch Deinen Post ein paar hilfreiche Denkanstöße bekommen ;)

Gruß
Jens
Antworten