Ich habe mehrere Threads, die Daten verarbeiten und in eine Warteschlange stellen, und einen einzelnen Thread, der Daten aus einer Warteschlange aufnimmt und dann in einer Datenbank speichert.Wie sqlite-Verbindung im Daemon-Thread zu schließen?
denke ich, die folgenden wird ein Speicherleck verursachen:
class DBThread(threading.Thread):
def __init__(self, myqueue):
threading.Thread.__init__(self)
self.myqueue = myqueue
def run(self):
conn = sqlite3.connect("test.db")
c = conn.cursor()
while True:
data = myqueue.get()
if data:
c.execute("INSERT INTO test (data) VALUES (?)", (data,))
conn.commit()
self.myqueue.task_done()
#conn.close() <--- never reaches this point
q = Queue.Queue()
# Create other threads
....
# Create DB thread
t = DBThread(q)
t.setDaemon(True)
t.start()
q.join()
ich nicht die conn.close()
in der while-Schleife setzen kann, weil ich denke, dass die Verbindung auf der ersten Schleife wird geschlossen. Ich kann es nicht in die if data:
-Anweisung schreiben, weil dann keine Daten gespeichert werden, die später in die Warteschlange gestellt werden.
Wo schließe ich die db Verbindung? Wenn ich es nicht schließe, führt das nicht zu einem Speicherleck?
Was bedeutet 'mit conn:' in diesem Fall? Normalerweise räumt es Ressourcen auf (in diesem Fall die Verbindung), was wir an dieser Stelle nicht wollen? – Caramiriel
@Caramiriel: Das ist richtig, wir wollen an diesem Punkt nicht aufräumen. Es tut jedoch nicht, was Sie denken; Es implementiert ein automatisches Commit/Rollback der Transaktion. Siehe [Verwenden der Verbindung als Kontextmanager] (https://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager). – mhawke