面试题答案
一键面试多线程环境下管理数据库连接资源
- 避免资源竞争:使用锁(
threading.Lock
)来确保同一时间只有一个线程能够访问数据库连接。 - 避免死锁:按照固定顺序获取锁,并且避免嵌套锁的复杂情况。
- 避免资源泄漏:使用
with
语句来确保连接在使用完后正确关闭。
示例代码:
import threading
import sqlite3
# 创建数据库连接
conn = sqlite3.connect('test.db')
lock = threading.Lock()
def execute_query(query):
with lock:
cursor = conn.cursor()
try:
cursor.execute(query)
result = cursor.fetchall()
return result
except sqlite3.Error as e:
print(f"An error occurred: {e}")
finally:
cursor.close()
# 模拟多个线程执行查询
threads = []
queries = ["SELECT * FROM your_table", "SELECT COUNT(*) FROM your_table"]
for query in queries:
t = threading.Thread(target=execute_query, args=(query,))
threads.append(t)
t.start()
for t in threads:
t.join()
conn.close()
异步编程环境下管理数据库连接资源
- 避免资源竞争:使用
asyncio.Lock
来确保同一时间只有一个协程能够访问数据库连接。 - 避免死锁:在异步编程中,死锁通常是由于协程之间相互等待造成的,通过合理设计协程的执行逻辑和资源获取顺序来避免。
- 避免资源泄漏:使用
async with
语句来确保连接在使用完后正确关闭。
示例代码(假设使用aiosqlite
库来支持异步数据库操作):
import asyncio
import aiosqlite
async def execute_query(query):
async with aiosqlite.connect('test.db') as conn:
async with conn.cursor() as cursor:
try:
await cursor.execute(query)
result = await cursor.fetchall()
return result
except aiosqlite.Error as e:
print(f"An error occurred: {e}")
# 模拟多个协程执行查询
queries = ["SELECT * FROM your_table", "SELECT COUNT(*) FROM your_table"]
tasks = [execute_query(query) for query in queries]
loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()