SQLite objects created in a thread?

KarlRanseierIII  14.11.2022, 23:21

Welchen Teil der Fehlermeldung verstehst Du nicht?

PHLMinions 
Beitragsersteller
 14.11.2022, 23:27

die komplette Fehlermeldung

3 Antworten

Die

sqlite3.ProgrammingError

-Ausnahme wird geworfen, wenn versucht wird, ein SQLite-Objekt in einem anderen Thread zu verwenden, als in dem es erstellt wurde. Dies ist normalerweise ein Zeichen dafür, dass das SQLite-Objekt nicht richtig synchronisiert wurde und von mehreren Threads gleichzeitig verwendet wird.

Um dieses Problem zu beheben, können Sie sicherstellen, dass das SQLite-Objekt nur von einem Thread zu einem Zeitpunkt verwendet wird. Hier ist ein Beispiel dafür, wie das in Python aussehen könnte:


Copy code
import sqlite3 from threading import Lock # Erstelle ein Mutex-Objekt zum Synchronisieren des Zugriffs auf das SQLite-Objekt mutex = Lock() # Erstelle eine Funktion, die das SQLite-Objekt verwendet def use_sqlite(): # Aquire the mutex to synchronize access to the SQLite object mutex.acquire() try: # Verwende das SQLite-Objekt hier... conn = sqlite3.connect("my_database.db") cursor = conn.cursor() cursor.execute("SELECT * FROM my_table") rows = cursor.fetchall() # Verarbeite die Daten aus der Datenbank... finally: # Stelle sicher, dass der Mutex immer freigegeben wird, auch wenn eine Ausnahme geworfen wird mutex.release()

Das obige Beispiel zeigt, wie man das

Lock

-Objekt aus dem

threading

-Modul verwendet, um den Zugriff auf das SQLite-Objekt zu synchronisieren. Wenn ein Thread die Funktion

use_sqlite()

aufruft, wird der Mutex mit

mutex.acquire()

erworben und der Zugriff auf das SQLite-Objekt wird gesperrt. Sobald die Verarbeitung des SQLite-Objekts abgeschlossen ist, wird der Mutex mit

mutex.release()

freigegeben, um anderen Threads den Zugriff auf das SQLite-Objekt zu ermöglichen.

Aussage der Fehlermldung:

Du erzeugst das Object in einem Thread und nutzt es in einem anderen - und das geht halt nicht.

Du kannst eine SQLite-Connection nicht in mehreren Threads nutzen

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

PHLMinions 
Beitragsersteller
 14.11.2022, 23:29

Wie ist das gemeint?

Wie kann ich das beheben?

0
Palladin007  14.11.2022, 23:33
@PHLMinions

Was davon verstehst Du nicht?

SQLite-Connection?
Threads?

Und beheben kannst Du das nur, wenn Du auch begreifst, was Du da tust ;)

0
PHLMinions 
Beitragsersteller
 14.11.2022, 23:37
@Palladin007

Ich verstehe was ich tue, nur eine andere Möglichkeit gibt es meiner Meinung nach nicht.

Ich Speicher etwas in die Datenbank und überprüfe dann ob eine gewisse Zeit abgelaufen ist, ich öffne danach eine Funktion und lösche in der Funktion den Eintrag, da ich den Eintrag für diese gewisse Zeit noch benötige, um z.B. Informationen zu sammeln.

0
Palladin007  14.11.2022, 23:40
@PHLMinions

... und irgendwo da hast Du einen Thread-Wechsel

Find's doch raus und lass dir Thread-IDs loggen

0
Palladin007  14.11.2022, 23:51
@PHLMinions

Wenn Du nach "python logging" suchst, findest Du was Du suchst.
Oder Du schreibst in die Konsole oder Du debuggst einfach.

1
PHLMinions 
Beitragsersteller
 15.11.2022, 00:04
@Palladin007

Hey,

ich fürchte ich habe den Fehler entdeckt.

 after=lambda lp: self.lp()

das sollte an dem after liegen, kann man irgendwie beheben?

0
Palladin007  15.11.2022, 00:46
@PHLMinions

Da kann ich nicht helfen, ich kenne mich mit Datenbanken, Multi-Threading und asynchroner Programmierung aus, aber nicht Python. Such doch mal, ob Du dazu was findest und achte auch auf "asynchron", auch da hast Du mehrere Threads im Spiel.

Für mich klingt das aber so, dass nach irgendwas, das Du vorher gestartet, der Lambda Code danach gestartet werden soll. Und das wiederum klingt sehr nach asynchroner Programmierung.

Aber Zeit X warten ist meiner Erfahrung nach immer ein Zeichen für gewaltige Probleme an anderer Stelle. Sowas braucht man eigentlich nur dann, wenn man auf etwas anderes (z.B. anderer Thread, andere DB-Abfrage, externes Gerät, etc.) warten will und irgendwann mal gemessen hat, dass es X Millisekunden dauert. Und was passiert, wenn das aus irgendeinem Grund doch länger dauert?

Also warum überhaupt warten?
Such lieber eine Lösung, wo Du nicht aktiv warten musst, z.B. mit dem Observer Pattern bzw. Events (ist das gleiche, nur anderer Name).
Oder lies dich in "echte" asynchrone Programmierung ein, die ist für genau sowas da, allerdings nicht gerade Anfängerfreundlich.
Je nachdem, was Du machst, kann beides aber ziemlich kompliziert werden, z.B. wenn Du ein externes Gerät hast, hast Du zwangsläufig mehrere Threads im Spiel und musst synchronisieren - oder es gibt eine API, die das bereits tut.

Wenn Du tatsächlich nur Zeit X warten willst, dann musst Du das eben machen, aber je nachdem, womit Du arbeitest, hast Du ggf. wieder verschiedene Threads, die synchronisiert werden müssn.

1