MST

星途 面试题库

面试题:Python多线程实现图书排名中的资源竞争问题

在Python使用多线程实现图书排名时,可能会遇到哪些资源竞争问题?如何使用锁机制来解决这些问题?请举例说明。
45.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

可能遇到的资源竞争问题

  1. 共享数据访问冲突:例如多个线程同时读取和修改图书排名数据(如一个全局的图书排名列表),可能导致数据不一致。比如线程A读取了排名第1的图书信息,准备进行一些计算后更新排名,但在它更新前,线程B也读取了同样的排名数据并进行了更新,这时线程A再更新就会覆盖线程B的更新,造成数据丢失。
  2. 文件I/O冲突:如果需要将图书排名结果写入文件,多个线程同时写入可能导致文件内容混乱,例如一个线程写入一部分内容,另一个线程紧接着写入,导致文件内容格式错误。

使用锁机制解决问题

在Python中,可以使用threading.Lock来解决资源竞争问题。

示例代码如下:

import threading

# 模拟图书排名数据
book_rankings = [{"title": "Book1", "rank": 1}, {"title": "Book2", "rank": 2}]
lock = threading.Lock()


def update_rank(book_title, new_rank):
    global book_rankings
    lock.acquire()
    try:
        for book in book_rankings:
            if book["title"] == book_title:
                book["rank"] = new_rank
                break
    finally:
        lock.release()


# 创建并启动线程
thread1 = threading.Thread(target=update_rank, args=("Book1", 3))
thread2 = threading.Thread(target=update_rank, args=("Book2", 4))

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print(book_rankings)

在上述代码中,lock.acquire()获取锁,确保只有一个线程可以进入临界区(修改book_rankings的部分),lock.release()释放锁,这样就避免了多个线程同时修改book_rankings造成的数据不一致问题。

对于文件I/O冲突,也可以类似地在文件写入操作前后加锁:

import threading

lock = threading.Lock()


def write_to_file(content):
    lock.acquire()
    try:
        with open('rankings.txt', 'a') as file:
            file.write(content + '\n')
    finally:
        lock.release()


# 创建并启动线程
thread3 = threading.Thread(target=write_to_file, args=("Book1 - Rank 3",))
thread4 = threading.Thread(target=write_to_file, args=("Book2 - Rank 4",))

thread3.start()
thread4.start()

thread3.join()
thread4.join()

这里在文件写入操作前后加锁,保证了多个线程写入文件时不会出现内容混乱的情况。