MST

星途 面试题库

面试题:Python多线程在数据处理中如何避免资源竞争

在Python多线程处理数据时,常常会遇到资源竞争问题。请描述一下什么是资源竞争,以及在Python中如何使用锁(Lock)机制来避免在数据处理过程中的资源竞争,举例说明在一个简单的数据累加场景下如何应用锁。
49.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 资源竞争的定义

资源竞争指的是多个线程同时访问和修改共享资源时,由于线程执行顺序的不确定性,导致最终结果与预期不符的情况。例如多个线程同时对一个共享变量进行读写操作,由于线程调度的随机性,可能会出现数据不一致、丢失更新等问题。

2. Python中锁(Lock)机制的使用

在Python中,threading模块提供了Lock类来处理资源竞争问题。Lock有两种状态:锁定(locked)和未锁定(unlocked)。线程可以通过调用acquire()方法来获取锁,如果锁处于未锁定状态,acquire()会将锁锁定并立即返回;如果锁已被其他线程锁定,acquire()会阻塞当前线程,直到锁可用。线程使用完共享资源后,需要调用release()方法释放锁,使其他线程能够获取锁并访问共享资源。

3. 数据累加场景下应用锁的示例

import threading

# 共享资源
total = 0
lock = threading.Lock()


def increment():
    global total
    for _ in range(1000000):
        # 获取锁
        lock.acquire()
        try:
            total += 1
        finally:
            # 释放锁
            lock.release()


threads = []
for _ in range(2):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"Final total: {total}")

在上述代码中,定义了一个共享变量total,并创建了一个锁lock。在increment函数中,每次对total进行累加前,先通过lock.acquire()获取锁,累加完成后通过finally块中的lock.release()释放锁,确保同一时间只有一个线程能修改total,从而避免资源竞争。最后启动两个线程并等待它们完成,输出最终的total值。