Ich glaube, es hängt nicht wirklich von der Sprache ab. Die Situation ist jedoch so, dass ich in Python das Web-Mini-Framework "bottle" nutze, aber "parallel" dazu eine (asynchrone) Verbindung zu einem anderen Gerät habe. Die Daten dieses Gerätes sollen dann per Web-Interface (bottle) abrufbar sein. Da "bottle" die Python-Thread-Funktionen nutzt, kann ich nicht z.B. das Webinterface in einem Thread laufen lassen und meine Geräteschnittstelle in einem anderen, so dass der Datenaustausch über Variablen erfolgen kann. Was sind die Möglichkeiten? Web-Framework nutzen, dass sich innerhalb eines Threads zufrieden gibt (bottle besteht aus einder Datei, das ist schön; ansonsten keine große Abhängigkeit)? Beide Programmteile als separate Prozesse ausführen - und dann wie kommunizieren (Schnittstelle oder über Datei?)? Ein paar allgemeine Ansätze wären schön..
Es gibt Pipes, Message Queues, Shared Memory, Remote Procedure Calls... such Dir was aus :) http://en.wikipedia.org/wiki/Inter-process_communication http://de.wikipedia.org/wiki/Interprozesskommunikation > Ich glaube, es hängt nicht wirklich von der Sprache ab. Dafür umso mehr vom Betriebssystem.
Hans schrieb: > Da "bottle" die Python-Thread-Funktionen nutzt, kann ich nicht z.B. das > Webinterface in einem Thread laufen lassen und meine Geräteschnittstelle > in einem anderen Wieso soll das nicht gehen? > "parallel" dazu eine (asynchrone) Verbindung zu einem anderen Gerät Das Ausschlaggebende ist wohl, was für eine Art von Verbindung das ist.
> Es gibt Pipes, Message Queues, Shared Memory, Remote Procedure Calls... > such Dir was aus :) Uiuiui! Danke schonmal für euer Feedback. Bevor ich mich über Prozesse informiere, Andreas scheint sich etwas auszukennen: Die Verbindung ist eine 'hörende' Verbindung per UDP. Mein Skript sammelt input vom Gerät und soll dann bei einem HTTP Request die Daten aufbereitet an einen Browser ausliefern. Warum es mit den Threads nicht geht, kann ich leider nicht genau sagen. Ich starte meine Klasse zur Kommunikation per "socket" in einem Thread, und dann den Server mit "bottle.run()". Im Prinzip klappt auch der Datenaustausch, d.h. der Server kann auf Daten aus 'meinem' Thread zugreifen. Das Problem ist, dass 'mein' Thread doppelt gestartet wird. Ich habe mich an einem Minimalbeispiel versucht, das darüberhinaus auch noch die Remote-Seite als UDP Echo emuliert - siehe Anhang. Anstelle die Kommunikations-Klasse in einem Thread auszuführen, wird nun direkt im Kommunikations-Thread kommuniziert. Das Verhalten ist aber wie im 'echten' Skript, die Threads werden zweifach gestartet und führen sofort zu einem Fehler, da so versucht wird, denselben (?) socket zu öffnen. Die zuerst gestarteten Threads scheinen zu laufen, der Webserver ist jedoch nicht erreichbar.. Da ich mich mit dem Thema nicht wirklich auskenne, hoffe ich, dass es evtl. doch eine Möglichkeit gibt, es so zum Laufen zu bekommen. Zielplattform ist Windows (und das in http://bottlepy.org/docs/dev/async.html vorgeschlagene gevent scheidet damit erstmal aus).
Möglicherweise sollte ich das mit dem Threading lassen und dem Betriebssystem die Prozessverwaltung überlassen und die Daten per Pipe vom Empfangs-Skript zum Web-Skript übergeben: http://stackoverflow.com/questions/3447846/sharing-data-between-processes-in-python
Via pipe klappt es auch nicht, da ich die Daten dann wohl nicht in "bottle" hineinbekomme. Evtl. kann ich mit "bottle" einfach eine statische HTML Datei ausliefern, die vom UDP-Skript erzeugt wird. Der Plattenverschleiß wird sich in Grenzen halten, allerdings finde ich die Lösung unschön.
Hans schrieb: > Das Problem ist, dass 'mein' Thread doppelt gestartet wird. Das darf nicht sein. Diesem Problem solltest du auf den Grund gehen. Vage Idee: erst bottle starten, dann deinen Thread. Vielleicht forkt bottle bei run(), wodurch dein Thread zweimal läuft.
bottle.run() blockiert, danach geht nichts mehr..
> Das darf nicht sein. Diesem Problem solltest du auf den Grund gehen.
Danke für den Hinweis! Das Threading des "Reloaders" verursacht das
Problem (bottle nutzt kein fork).
Ohne reloader=True läuft es:
1 | bottle.run(host='localhost', port=8080) |
Daher auch die Warnung in http://bottlepy.org/docs/dev/tutorial.html#auto-reloading : > All module-level code is executed at least twice! Be careful.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.