Threads und Nachrichten, brauche Hilfe beim Design

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
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Hi, ich arbeite gerade an der Kommunikation zwischen verschiedenen
Programmteilen, mittels Events und Queues. Bin aber noch nicht recht
zufrieden, da so wies jetzt gemacht ist, die Events die verschickt werden,
immer an alle, den Sender eingeschlossen, verschickt werden.
Um allerdings an ein bestimmten Programmteil zu verschicken,
muss dieser dem Sender bekannt sein. Das ist aber gerade das, was ich vermeiden möchte.

Währe auch unter anderem über eine gute Buchempfehlung/Addresse
zum Thema Design/MVC mit Python glücklich ;)

Hier gehts zum Code
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du könntest einen zentralen Verteiler bauen, an den alle (Threads) ihre Nachrichten schicken können. Möchte ein Thread bestimmte Nachrichten empfangen, so muss er sich zuvor beim Verteiler registrieren. Jedes Mal, wenn der Verteiler eine Nachricht empfängt schaut dieser einfach nur nach wohin sie verteilt werden sollen und packt sie dort in eine Queue.

Vielleicht passt das auf dein Problem, vielleicht aber auch nicht^^ Deine Beschreibung ist um genaueres zu sagen noch nicht detailliert genug.

Als Buchempfehlung könnte dich das Thema "Entwurfsmuster" interessieren. "Head First - Design Patterns" ist recht gut geschrieben und bietet einen netten Einstieg. Ist teilweise etwas ausführlich, für Anfänger sollte es jedoch recht hilfreich sein. Alles in Java, aber wirklich nur minimale Grundkenntnisse benötigt.
Das Leben ist wie ein Tennisball.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

immoment funktioniert das ganze so, dass ein Thread sich beim `Messenger registriert, und dann an einen `Tunnel` angeschlossen wird,
über den er mittels put nachrichten an den Messenger schicken kann, oder mittels get eine Nachricht vom Messenger kriegen kann. Ebenso der Messenger.

Der Messenger verteilt dann jede Nachricht an alle registrierten Threads oder Objecte.
Das ist allerdings ziemlich unpraktisch, so wird jede Nachricht die ein Thread abschickt bei allen anderen Registrierten Threads im selbst eingeschlossen
in den Input Queue gesteckt.
Das würde ich gerne vermeiden, indem die anderen Threads Namen bekommen, o.ä. über die sie Identifizierbar werden.
Allerdings will ich `möglichst` keine Hardcodierten Namen benutzen,
die dann ein Sendender Thread kennen muss, damit die Nachricht beim richtigen anderen Thread ankommt.

Ausserdem würde ich für den View gerne Mehrere Tunnel benutzen,
ich hatte bei einer `früheren Version` das Problem, dass Events vom Model im gleichen Queue angekommen sind, wie die Nachrichten vom
KeyLogger/MouseLogger/.... und das ankommen von Mouse/Key Events verzögert haben.

Wenn ich erlich bin, bin ich ein wenig Ratlos, wie man sowas am besten macht, damit der Code auch schön Flexibel und allgemein Verwendbar bleibt.
Ich kann noch nicht genau absehen, wieweit das Programm sich noch entwickeln, wie groß der Umfang des Models Endgültig sein wird und was der View also alles Darstellen können muss.


Entwurfsmuster hört sich auf jedenfall schonmal nach dem Richtigen Thema an ;)
Es wäre zwar schöner, wenns mit Python wäre, ( hab ne kleiner Aversion gegenüber Java, kann man auch gleich C++ lernen ) aber geht ja eigentlich nur ums Prinzip.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nuss hat geschrieben:schön Flexibel und allgemein Verwendbar
Hallo nuss!

Du könntest dir z.B. das Eventmodell von wxPython ausleihen um Nachrichten zu verteilen.

Komplexes (nur kurz getestetes) Beispiel: http://paste.pocoo.org/show/111891/

EDIT:

Beispiel etwas vereinfacht: http://paste.pocoo.org/show/111902/


mfg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 10. April 2009, 11:06, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Um das Verteilen an alle Threads zu verhindern, sollten sich diese nur für die Nachrichten registrieren für die sie sich auch interessieren (damit kann auch der View mehrere Tunnel haben). Das eine Nachricht an den Sender zurück gesendet wird kannst du vermeiden, indem du du den Namen des Thread mitlieferst. Also entweder eine Referenz auf diesen, eine beim Registrieren vergebene ID oder einen globalen Namen.

Möchtest du Nachrichten an ganz bestimmte andere Thread senden, so bleibt dir nichts anderes übrig, als einen relativ globalen Namen für diese zu vergeben, oder die Registrierung sehr fein zu machen. Wenn du die Namen als Konstanten hältst, dann ist es nur halb so wild.

Sieh Java einfach als Mittel zum Zweck, die Sprache wird dir fast überall begegnen ;-) "Gleich C++ lernen" würde ich im Vergleich mit Java nicht einfach so daher sagen. C++ ist um Weiten komplexer.
Das Leben ist wie ein Tennisball.
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

nuss hat geschrieben: Der Messenger verteilt dann jede Nachricht an alle registrierten Threads oder Objecte.
Das ist allerdings ziemlich unpraktisch, so wird jede Nachricht die ein Thread abschickt bei allen anderen Registrierten Threads im selbst eingeschlossen
in den Input Queue gesteckt.
Das würde ich gerne vermeiden, indem die anderen Threads Namen bekommen, o.ä. über die sie Identifizierbar werden.
Allerdings will ich `möglichst` keine Hardcodierten Namen benutzen,
die dann ein Sendender Thread kennen muss, damit die Nachricht beim richtigen anderen Thread ankommt.
Überleg dir, was einen Thread, der die Nachricht bekommen soll, von allen anderen unterscheidet. Dann überleg dir, woher diese Information ursprünglich kommt und an welcher Stelle die Unterscheidung geschehen soll. Dann überleg einen Informationsfluss, wie die Information von A nach B kommen soll und eine Struktur, wie sie bei B gespeichert wird.
http://www.felix-benner.com
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Hab mich mal hingesetzt und nen Controller programmiert.
http://paste.pocoo.org/show/112202/
und noch ein beispiel, wies immoment benutzt werden
kann: http://paste.pocoo.org/show/112203/
ist noch nicht komplett getestet.

was ein bisschen stört, ist der relativ hohe overhead.
ist jetzt die Frage, worans liegt, eventuell kann man dem ja auch mit
cython oder eventuell pypy zu leibe rücken.

Hat sich eigentlich in letzter zeit schonmal jemand damit beschäftigt,
mit pypy python-code zu compilieren? bzw. gibt's da irgendeinen spürbaren fortschritt?

@gerrold
irgendwie kann ich mich nicht entscheiden, welches framework ich benutzen möchte, und möchte auch nicht unbedingt unötige abhängigkeiten mitschleppen.
Qt soll besser sein als gtk *, die Lizensierung, finde ich persöhnlich allerdings ein bisschen blöd, und die Dokumentation für die python-bindings ist erlichgesagt nicht vorhanden. Zumindest nicht für Qt4.

Tk sieht scheiße aus, und ist für Moderne praxisorientierte programme
IMHO nicht geeignet. Besitzt ausserdem wahrscheinlich auch kein vernünftiges Event-System, dass man sich ausleihen könnte.

Bleiben also eigentlich nurnoch gtk/wx welche ja im endefeckt ziemlich nah beieinander liegen. ( wx hast du ja auch vorgeschlagen )

Mir fehlt so ein bisschen ein natives python-framework,
für das man sich entscheiden kann, weils halt "python" ist. ;)

Vielleicht sollte ich mal die Konsequenz ziehen, und probieren
auf der python-xlib ein kleines Framework aufzubauen.

Am schönsten wärs, wenn so ein Framework eine Nette API hätte,
die man dann mit dem entsprechenden Unterbau auch unter Windows,
und wenn Mac OS was anderes als X benutzt, unter Mac OS benutzen kann.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

nuss hat geschrieben:Hat sich eigentlich in letzter zeit schonmal jemand damit beschäftigt,
mit pypy python-code zu compilieren? bzw. gibt's da irgendeinen spürbaren fortschritt?
Pypy ist nicht dazu gedacht, Python zu Maschinencode zu übersetzen. Pypy kann zwar eine begrenze Untermenge von Python (RPython) nach C/whatever übersetzen, das ist aber nicht die Hauptaufgabe von Pypy. Pypy ist ein Iterpreter-Generator. Das heißt, dass Pypy irgendwann vielleicht mal einen schnelleren Python-Interpreter erstellt.

Ich hab deine Implementierung jetzt nicht angeschaut, aber wenn dir das zu langsam ist, dann bringt es vermutlich mehr den den Overhead zu minimieren (den Algorithmus zu ändern) als nur die Symptome zu bekämpfen.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

Ich halte es durchaus für eine der Hauptaufgaben von Pypy, Python-Code oder anderen Code, für den ein "pypy" Interpreter Existiert, zu anderem
Code, für den ein "pypy" Interpreter existiert zu übersetzen. Nur eine der "Möglichkeiten" als "die Hauptaufgabe zu Titulieren" wird IMHO Diesem Project nicht ganz gerecht ;)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dann hast du Pypy nicht ganz verstanden. Pypy kann kein Python und auch keinen anderen Code für den ein mit pypy geschriebener Intepreter existiert nach C/whatever übersetzen, sondern nur RPython. Und es gibt wohl auch keine Bestrebungen in absehbarer Zeit daran irgendetwas zu ändern.

Worauf ich eigentlich hinauswollte ist, dass Pypy nicht dafür gedacht ist, mal eben irgendwelchen Python-Code zu Maschinencode zu kompilieren damit es schneller wird.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

3.1 The Translation Framework
The job of the translation tool chain is to translate RPython programs into an efficient version of that program for one of various target platforms, generally one that is considerably lower-level than Python.
zugegeben, ist für den pypy-interpreter für die entsprechende Sprache,
aber man kann, und soll auch die möglichkeit haben RPython Programme
zu Modulen der Sprache, zu der der entsprechende Python-Interpreter Compiliert wurde zu compilieren.
Sprich man kann auch seine eigenen Programme mithilfe des "Translation Framework's" zu dem Code Compilieren,
auf dem Der entsprechende Interpreter beruht, solange der Code Rpython-Compatible ist.

P.S. ich habe wirklich angenommen, man könnte mit pypy auch Rpython-kompatiblen code zu python-c-modulen Compilieren ;)


edit:
und nach eigenen Angaben, ist Rpython zu 9x% mit Cpython kompatible,
weiß grad nicht die genaue Zahl, hab ich irgendwann auf der Seite gelesen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

RPython ist schon ziemlich eingeschränkt und du willst damit nicht wirklich große Anwendungen schreiben und dass ist auch ganz sicher nicht das Ziel von PyPy.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

naja gut, vergessen wir mal pypy ;)
Antworten