MST
星途 面试题库

面试题:Python资源管理在多线程和异步编程中的挑战与解决方案

在多线程或异步编程环境下,Python的资源管理面临着一些特殊的挑战,例如资源竞争、死锁等。请以数据库连接资源为例,说明在多线程和异步编程中,如何有效地管理数据库连接资源以避免资源泄漏、竞争条件和死锁问题。并分别给出多线程和异步编程下管理数据库连接资源的代码示例。
26.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

多线程环境下管理数据库连接资源

  1. 避免资源竞争:使用锁(threading.Lock)来确保同一时间只有一个线程能够访问数据库连接。
  2. 避免死锁:按照固定顺序获取锁,并且避免嵌套锁的复杂情况。
  3. 避免资源泄漏:使用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()

异步编程环境下管理数据库连接资源

  1. 避免资源竞争:使用asyncio.Lock来确保同一时间只有一个协程能够访问数据库连接。
  2. 避免死锁:在异步编程中,死锁通常是由于协程之间相互等待造成的,通过合理设计协程的执行逻辑和资源获取顺序来避免。
  3. 避免资源泄漏:使用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()