MST

星途 面试题库

面试题:Python多线程性能调优之资源竞争处理

在Python多线程编程中,当多个线程同时访问和修改共享资源时,可能会出现资源竞争问题,导致数据不一致或程序错误。请描述一种常见的资源竞争场景,并说明如何使用Python中的锁机制(如`threading.Lock`)来解决该问题,同时给出相应的代码示例。
44.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

常见资源竞争场景

假设有多个线程对一个共享的计数器变量进行累加操作。例如,在线程1读取计数器的值后,还未进行累加并写回时,线程2也读取了该值,这样就会导致两个线程累加的结果丢失一次,最终计数器的值并非预期的多次累加后的结果。

使用threading.Lock解决问题

threading.Lock提供了一种简单的同步机制。线程在访问共享资源前获取锁,访问完后释放锁,这样同一时间只有一个线程能访问共享资源,避免资源竞争。

代码示例

import threading

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


def increment():
    global counter
    for _ in range(1000000):
        # 获取锁
        lock.acquire()
        try:
            counter = counter + 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 counter value: {counter}")

在上述代码中,每个线程在对counter进行累加操作前,先通过lock.acquire()获取锁,确保同一时间只有一个线程能操作counter,操作完成后通过lock.release()释放锁。try - finally语句确保无论在操作counter过程中是否出现异常,锁都会被正确释放。