On Sat, Jul 15, 2006 at 12:22:48AM +0200, Frank Benkstein wrote:
Hallo, Thomas,
Hi,
Twisted lauscht doch an einem oder mehreren Filedescriptoren/Sockets (select, bzw. poll) und verarbeitet dann die Descriptoren über die Daten gerade angekommen sind. Arbeitet dabei nur eine Instanz des Pythoninterpreters (ein Prozess)? Wenn dem so wäre, dann würde doch das Abarbeiten der anderen Anfragen stehenbleiben, falls mal das bearbeiten eines Events lange dauert.
Twisted arbeitet im Allgemeinen ohne Forks oder Threads (obwohl das möglich ist). Jede Funktion muss daher die Kontrolle so schnell wie möglich wieder an die Hauptschleife zurückgeben. Ist in einer Funktion das zurückzugebene Ergebnis aber nicht sofort da, kann die Funktion auch ein Deferred-Objekt zurückgeben, quasi ein Versprechen, dass es das Ergebnis später noch geben wird. Um mit dem Ergebnis dann umzugehen, muss sich eine Funktion als Callback (oder Errback, um einen Fehler zu fangen) bei dem Deferred-Objekt registrieren.
Also einfach gesagt eventbasierte Programmierung, man hat eine Mainloop die auf Ereignisse wartet (Networkinput, Userinput, Timer) und man registriert Callbacks für diese Events.
In dem Fall muss man wirklich überlegen wie sich das Programm beim Abarbeiten großer Datenmangen verhalten soll. Ein Weg wäre den Bottom-Half Ansatz des Linux-Kernels bei Interrupts zu verwenden, der Callback macht nur das wirklich Notwendige (z.B. Sichern der einkommenden Daten in einen Buffer), registriert eine Methode die irgendwann später ausgeführt wird zum Bearbeiten der Daten, und kehrt dann sofort in die Mainloop zurück.
Der sauberere Weg IMHO würden aber Worker-Threads bzw. Worker-Forks sein. Bietet Python eine Möglichkeit an Socket-Descriptoren an einen anderen Prozess weiterzugeben?
Just my 2¢
Ciao, Tobias