SQLite objects created in a thread?
Guten Abend,
ich erhalte ständig diesen Fehler nachdem ich eine Interaktion ausgeführt habe.
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 2052 and this is thread id 6384.
Liebe Grüße
Welchen Teil der Fehlermeldung verstehst Du nicht?
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
Was davon verstehst Du nicht?
SQLite-Connection?
Threads?
Und beheben kannst Du das nur, wenn Du auch begreifst, was Du da tust ;)
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.
... und irgendwo da hast Du einen Thread-Wechsel
Find's doch raus und lass dir Thread-IDs loggen
Wenn ich fragen darf.. Wie kann ich die den Loggen?
Wenn Du nach "python logging" suchst, findest Du was Du suchst.
Oder Du schreibst in die Konsole oder Du debuggst einfach.
Hey,
ich fürchte ich habe den Fehler entdeckt.
after=lambda lp: self.lp()
das sollte an dem after liegen, kann man irgendwie beheben?
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.
Wie ist das gemeint?
Wie kann ich das beheben?