Forum: PC-Programmierung Alternative zu Threads (Prozesse?) und Kommunikation


von Hans (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Hans (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hans (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

bottle.run() blockiert, danach geht nichts mehr..

von Hans (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.