0
我有多個線程處理數據並將其放在一個隊列中,並有一個線程從隊列中獲取數據,然後將其保存到數據庫中。如何在守護程序線程中關閉sqlite連接?
我認爲以下原因會導致內存泄漏:
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()
我不能把conn.close()
while循環,因爲我認爲,將關閉在第一回路的連接。我不能將它放在if data:
語句中,因爲它不會保存稍後可能放入隊列的數據。
我在哪裏關閉數據庫連接?如果我不關閉它,這會不會導致內存泄漏?
在這種情況下'conn:'做什麼?通常它會清理資源(在這種情況下是連接),這不是我們現在想要的嗎? – Caramiriel
@ Caramiriel:沒錯,我們不想在那個時候清理。然而,它不會做你的想法;它實現了事務的自動提交/回滾。請參閱[使用連接作爲上下文管理器](https://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager)。 – mhawke