PyMySQL - Performance Probleme beim Verbidnen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Forengemeinde,

    mein Problem bezieht sich auf PyMySQL. Ich habe mit dem Raspberry Pi 3 eine Fotobox realisiert. Nach jedem geschossenen Foto wird ein Eintrag in der lokalen Datenbank erstellt. Der Raspberry spannt sein eigenes WLAN Netzwerk auf, sodass sich Benutzer der Fotobox mit dem Pi verbinden können und Fotos anschauen. Da ich den Pi mit der bestehenden Konfiguration nicht in mein WLAN ziehen kann, verwende ich zusätzlich ein Ethernet Kabel, welches mit meinem Router verbunden ist, und ich zu Wartungszwecken mich mittels VNC auf dem Pi im heimischen Netzwerk einloggen kann.

    Jetzt ist mir erstmals aufgefallen, das die Verbindung zur Datenbank ca 15 Sekunden in Anspruch nimmt, wenn der Pi nicht am Ethernetkabel hängt. Mit Kabel (in diesem moment auch mit Internet) funktionert die Verbindung einwandfrei und das Script läuft flüssig weiter. Da ich aber die Fotobox in Umgebungen stehen hab, wo kein Internet zur Verfügung steht, ist das natürlich blöd, wenn das Script nach jedem Foto 15 Sekunden hängen bleibt.

    Hat jemand eine Lösung für dieses Problem? Im Codeblock habe ich die betreffende Stelle nochmal kommentiert. Vielen Dank schonmal

  • Ich hätte auch auf Namensauflösung getippt, setze den timeout mal runter:

    options timeout:<desired timeout in seconds> in /etc/resolv.conf.

    Welches OS setzt Du ein?

    Ich schätze mal das RaspberryOS einen anderen Resolver hat, resolvconf könnte da Dein Freund sein.

  • Zur Namensauflösung wird eigentlich zuerst die Datei /etc/hosts kontaktiert. Dort sollte es bereits zu einem gültigen Ergebnis kommen.

    Ich vermute eher, dass ein aktivierter NetworkManager-wait-online.service den sofortigen Zugriff auf die lokale IP des mySQL Servers blockiert.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • maikh Wenn das auf dem gleichen Rechner läuft könnte man auch versuchen die Verbindung nicht über das Netz zu machen, sondern über Unix-Domain-Sockets.

    Anmerkungen zum Quelltext: Das mit dem Datum/Zeitstempel ist falsch/fehlerhaft. Der muss schon als Argument in diese Funktion rein kommen, denn wenn Du in der Funktion die aktuelle Zeit ermittelst, kann es passieren, dass das Foto nicht in dem Verzeichnis liegt, weil das um Mitternacht herum bereits am Vortrag geschossen und gespeichert worden sein kann, kurz nach Mitternacht aber erst diese Funktion aufgerufen wird. Das gleiche kann passieren wenn der Tageswechsel innerhalb der Funktion auftritt, irgendwo zwischen den drei (!) Aufrufen von datetime.now(). Wenn man einen Zeitpunkt ermitteln will, darf man das nur genau einmal machen, denn zwischen jedem Aufruf vergeht ja Zeit, und dann kann es passieren das am Ende Datum und Zeitangaben von zwei Zeitpunkten nicht zum gleichen Tag gehören.

    timestamp wird falsch ermittelt. Man ruft die Methoden nicht wie eine Funktion auf dem Datentyp auf, sondern auf dem Objekt selbst.

    /var/www/html/eos/ sollte nicht mehrfach im Quelltext stehen. Wenn man das mal ändert, sollte man das an genau einer Stelle ändern muss.

    Pfadangaben sind keine beliebigen Zeichenketten und + ist nicht geeignet um die unfallfrei zu verketten. Es gibt dafür extra das pathlib-Modul. Und das sollte man auch anstelle von den alten os, os.path, und glob Modulen verwenden, wenn es um Operationen auf Pfaden geht.

    Der Name pfad wird definiert, aber nirgends verwendet. shot_time wird viel zu früh definiert, das wird ja erst viel später verwendet. Und der Name ist falsch, denn es enthält mehr als nur die Zeit. Es ist auch total überflüssig, denn es enthält die gleiche Information wie der timestamp-Wert, der ebenfalls in der Datenbank gespeichert wird, und album im gleichen Datensatz enthält auch noch mal Information die in timestamp bereits enthalten ist. Man speichert keine so verdammt viel redundante Daten.

    Das Datum im Pfadnamen ist unpraktisch sortiert. Wenn man das nach der höchstwertigen Komponente absteigend sortiert, also Jahr, Monat, Tag, dann ist am Ende die lexikografische Sortierung gleich der zeitlichen.

    Grunddatentypen haben nichts in Namen zu suchen. Man ändert den Typ gerne mal während der Entwicklung und dann hat man entweder falsche, irreführende Namen im Programm oder man muss die betroffenen Namen überall anpassen. list_of_files wäre einfach nur files. Wobei das inhaltlich falsch ist, denn das sind keine Dateien, sondern Dateinamen. Bei Dateien würde man Methoden wie read() oder write() und close() erwarten. file_paths wäre das hier.

    Namen sollten keine kryptischen Abkürzungen enthalten. Nicht img, conn, oder cur, wenn man image, connection, und cursor meint.

    Die Verbidnung wird an der falschen Stelle geschlossen. Wenn das connect() nicht funktioniert hat, dann gibt es den Namen gar nicht und man läuft im finally-Zweig in eine Ausnahme. Für deterministische close()-Aufrufe eignen sich with und contextlib.closing().

    Den Cursor sollte man auch schliessen.

    Eine beliebige Ausnahme behandeln in dem man sie einfach nur ausgibt, macht die Fehlersuche unnötig schwer. Dafür braucht man auch noch den Traceback. Den bekommt man beispielsweise wenn man statt sich mit print() logging selber bastelt, einfach eine Bibliothek dafür verwendet. Zum Beispiel logging aus der Standardbibliothek oder etwas externes wie loguru.

    Ungetestet:

    "He who laughs last thinks slowest"

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!