Problem mit multithreading -_- Python Websocket Server -_-

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Du in Temperature_Control.__init__ nicht Echo.__init__ aufrufst, ist die Echo-Funktionalität kaputt. Also braucht Temperature_Control client, server, sock und address, was es aber nicht haben kann, weil ja Temperatur_Control nicht mit einem Client verknüpft ist. Daher ist die Vererbung vollkommen verquer.

`lambda` ist nicht nötig, weil Thread dafür passende Argumente hat:

Code: Alles auswählen

threading.Thread(target=control.control, args=('get', ))
Du mußt ganz klar die Kommunikation mit den Web-Clients von der Hardwareansteuerung trennen. Im Moment sieht das sehr verschränkt aus.
Soulpilot
User
Beiträge: 63
Registriert: Sonntag 24. April 2022, 12:19

Sirius3 hat geschrieben: Montag 21. November 2022, 13:36 Da Du in Temperature_Control.__init__ nicht Echo.__init__ aufrufst, ist die Echo-Funktionalität kaputt. Also braucht Temperature_Control client, server, sock und address, was es aber nicht haben kann, weil ja Temperatur_Control nicht mit einem Client verknüpft ist. Daher ist die Vererbung vollkommen verquer.

`lambda` ist nicht nötig, weil Thread dafür passende Argumente hat:

Code: Alles auswählen

threading.Thread(target=control.control, args=('get', ))
Du mußt ganz klar die Kommunikation mit den Web-Clients von der Hardwareansteuerung trennen. Im Moment sieht das sehr verschränkt aus.
Ja aber client benötige ich doch für die Steurrung von der Hardware.

Also gut, ich habe es so versucht und erhalte folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "websocketserver6_threading.py", line 516, in control
    rp = self.modbus.read_coils(524, 0x1)
AttributeError: 'str' object has no attribute 'modbus'

Code: Alles auswählen

class Temperature_Control2():

    def __init__(self, value):
        if value is None:
            value = {}
        self.value = value

    def control(self, value):
        while True:
            for thread in threading.enumerate():
                print(thread.name)

            rp = self.modbus.read_coils(524, 0x1)
            print(rp.bits[0])
            time.sleep(1)

def main():
    logging.basicConfig()
    with ModbusClient(host=HOST, port=PORT) as client:
        client.connect()
        time.sleep(0.01)

        print("Websocket server on port %s" % PORTNUM)
        server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))

        control = Temperature_Control2
        t2 = threading.Thread(target=control.control, args=('get', ''))
        t2.start()

        try:
            server.serveforever()
        finally:
            server.close()

if __name__ == "__main__":
    main()
Soulpilot
User
Beiträge: 63
Registriert: Sonntag 24. April 2022, 12:19

Soulpilot hat geschrieben: Montag 21. November 2022, 14:14
Sirius3 hat geschrieben: Montag 21. November 2022, 13:36 Da Du in Temperature_Control.__init__ nicht Echo.__init__ aufrufst, ist die Echo-Funktionalität kaputt. Also braucht Temperature_Control client, server, sock und address, was es aber nicht haben kann, weil ja Temperatur_Control nicht mit einem Client verknüpft ist. Daher ist die Vererbung vollkommen verquer.

`lambda` ist nicht nötig, weil Thread dafür passende Argumente hat:

Code: Alles auswählen

threading.Thread(target=control.control, args=('get', ))
Also gut, so scheint es zu laufen, ohne Vererbung und mit client, damit modbus funtkioniert. Was denkt Ihr?

Code: Alles auswählen


class Temperature_Control2():

    def __init__(self, client):
        self.modbus = client

    def control(self, value):
        while True:
            print("temp_control_class")
            for thread in threading.enumerate():
                print(thread.name)

            rp = self.modbus.read_coils(525, 0x1)
            print(rp.bits[0])
            time.sleep(2)

def main():
    logging.basicConfig()
    with ModbusClient(host=HOST, port=PORT) as client:
        client.connect()
        time.sleep(0.01)

        print("Websocket server on port %s" % PORTNUM)
        server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))

        control = Temperature_Control2(client)
        t2 = threading.Thread(target=control.control, args=('get', ))
        t2.start()

        try:
            server.serveforever()
        finally:
            server.close()

if __name__ == "__main__":
    main()
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch wenn die eine Klasse jetzt schon ein bisschen besser ist - wozu ist denn value? Das wird nicht benutzt, und als dauerhafte Kontroll-Variable hat es keinen Sinn, denn du uebergibst das ja nur einmal zu Beginn. Warum fuehrst du sowas ein?
Soulpilot
User
Beiträge: 63
Registriert: Sonntag 24. April 2022, 12:19

__deets__ hat geschrieben: Montag 21. November 2022, 15:19 Auch wenn die eine Klasse jetzt schon ein bisschen besser ist - wozu ist denn value? Das wird nicht benutzt, und als dauerhafte Kontroll-Variable hat es keinen Sinn, denn du uebergibst das ja nur einmal zu Beginn. Warum fuehrst du sowas ein?
Danke, ich möchte ja das Programm noch weiter entwickeln, und value soll dann später tatsächlich übergeben werden, für den schnellen Test habe ich die Variable manuell reingeschrieben.

Und sorry, wenn das manchmal bisschen wired ist, ich habe 2 Entwicklungszweige, einen stable und einen im testing^^
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

YAGNI. Du hast ueberhaupt keine Ahnung, was du wann wie wo brauchst. Und ob das, was du dir vorher ausgedacht hast, auf deine Anforderung passt. Lass sowas einfach weg. Es macht dein Leben jetzt mehr kompliziert, und muss einfach nur spaeter aufgeraeumt werden.
Soulpilot
User
Beiträge: 63
Registriert: Sonntag 24. April 2022, 12:19

__deets__ hat geschrieben: Montag 21. November 2022, 15:30 YAGNI. Du hast ueberhaupt keine Ahnung, was du wann wie wo brauchst. Und ob das, was du dir vorher ausgedacht hast, auf deine Anforderung passt. Lass sowas einfach weg. Es macht dein Leben jetzt mehr kompliziert, und muss einfach nur spaeter aufgeraeumt werden.
Verstanden, werde ich machen. Vielen Dank für Deine bzw. Eure Hilfe!


Ich habe aber dennoch ein paar Fragen, ich werde erst wieder in ein paar Wochen zum Programmieren kommen, daher wollte ich das noch im Vorfeld abklären.

- Wie kann ich mein DB Handling aufräumen, globale Methoden bauen oder besser in Klassen packen? Falls eine Klasse Database gemacht wird, müssen die Klassen dann von der DB-Klasse erben um die Methoden verwenden zu können, konkret SQLite schreiben/lesen?

- Ich wollte auch zum Beispiel für Temperatur einen Graphen bauen, der dann im Frontend angezeigt wird. Wie sollte ich das mit den Temperaturwerten machen? Frontend und Backend sollten auch auf verschiedenen Hosts laufen, deswegen die Frage? Wäre es möglich, das mit Python zu bauen und dann in meinen JS Client zu integrieren, also rein theoretisch? Was gibt es da für Möglichkeiten, könnt Ihr mir ein paar Beispiele nennen? Im moment denke ich noch über mysql, die seperat gehostet wird.
Antworten