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