ThreadingTCPServer und parallel etwas ausführen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

Hallo zusammen,

was die Netzwerkprogrammierung mit Python betrifft bin ich noch neu, deswegen spiele ich seit längerem mit einem kleinen Server.

Ich habe jetzt einen Server geschrieben, der die Daten, die er von einem Client erhält an eine Liste anfügt. Also nichts weltbewegendes, quasi nur die handle-Methode vom BaseRequestHandler überschrieben. Momentan bin ich dabei das ganze via locking auch für mehrere Clients "abzusichern".

So, genug der Vorgeschichte, der Grund meiner Frage ist folgender:
Ich möchte, das der Server ganz normal Daten von den Clients annimmt und an die Liste anhängt aber parallel dazu Daten aus der Liste wieder abruft und damit etwas macht (natürlich nur wenn Daten vorhanden sind).

Quasi hängen Clients auf der einen Seite der Liste an, während der Server auf der anderen Seite der Liste die Daten wieder abrufen soll.


Jetzt fehlt mir leider der Ansatzpunkt, denn wenn der Server mit "serve_forever()" gestartet ist, kann er ja nichts weiteres ausführen.
An welcher Stelle sollte ich den Code einfügen, der die Liste parallel zum anfügen abarbeitet? Einfach in die handle-Methode?

Ich bin für Denkanstöße sehr dankbar. Ich habe mir jetzt auch noch das Buch "Foundations of Python Network Programming" geordert, vielleicht kann mir das auch weiterhelfen.

Freundliche Grüße
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du erstellst einen Thread, welcher die Arbeit übernimmt. Dieser wartet dann so lange, bis wieder etwas in der Liste liegt.

Falls du das "Queue"-Modul noch nicht kennen solltest, dann wirf einen Blick rein. Dann fällt die zu lockende Liste weg.
Das Leben ist wie ein Tennisball.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

EyDu hat geschrieben:Du erstellst einen Thread, welcher die Arbeit übernimmt. Dieser wartet dann so lange, bis wieder etwas in der Liste liegt.

Falls du das "Queue"-Modul noch nicht kennen solltest, dann wirf einen Blick rein. Dann fällt die zu lockende Liste weg.
Ja, das Queue Modul kenne ich schon, das werde ich vermtl. auch verwenden. Aber wie verbinde ich beides miteinander? Zuerst den Thread der die Daten nacheinander abarbeitet als Daemon starten und im Anschluss dann alles was mit dem Netzwerkserver zu tun hat? Hier sitze ich noch auf dem Schlauch.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Thread besitzt eine Queue. Wenn der Server Daten erhält, dann hängt er sie an der Queue an. Immer wenn neue Daten in der Queue sind, dann fängt der Thread an zu arbeiten.

Oder in Pseude-Code:

Code: Alles auswählen

class Server(...):
    def __init__(self, queue, ...):
        ...
        self.queue = queue

    def on_data(self, some_data):
        ...
        self.queue.put(some_data)
        ...

class Consumer(Thread):
    def __init__(self):
        self.queue = Queue()
        
    def run(self):
        while True:
            data = self.queue.get()
            ...

c = Consumer()
s = Server(c.queue)

c.start()
s.start()
Das Leben ist wie ein Tennisball.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

EyDu hat geschrieben:Der Thread besitzt eine Queue. Wenn der Server Daten erhält, dann hängt er sie an der Queue an. Immer wenn neue Daten in der Queue sind, dann fängt der Thread an zu arbeiten.

Oder in Pseude-Code:

Code: Alles auswählen

class Server(...):
    def __init__(self, queue, ...):
        ...
        self.queue = queue

    def on_data(self, some_data):
        ...
        self.queue.put(some_data)
        ...

class Consumer(Thread):
    def __init__(self):
        self.queue = Queue()
        
    def run(self):
        while True:
            data = self.queue.get()
            ...

c = Consumer()
s = Server(c.queue)

c.start()
s.start()
Jetzt hats Klick gemacht... Vielen Dank :D
Antworten