MST

星途 面试题库

面试题:Python多线程中数据竞争场景及基础解决方案

请描述在Python多线程编程中,可能会出现数据竞争的常见场景,并阐述至少一种解决数据竞争的基础方法。
33.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

常见场景

  1. 共享变量读写:多个线程同时对同一个全局变量进行读写操作。例如在一个银行账户余额的模拟场景中,多个线程同时进行存款和取款操作,若没有同步机制,可能导致余额计算错误。
  2. 资源竞争:多个线程竞争使用同一资源,如文件的读写。如果多个线程同时尝试写入同一个文件,可能会导致文件内容混乱。

解决方法

  1. 锁机制(Lock
    • 原理Lock是一种简单的同步原语。当一个线程获取到锁时,其他线程必须等待锁被释放才能获取锁并执行相关操作,从而避免数据竞争。
    • 示例代码
import threading

# 共享变量
counter = 0
lock = threading.Lock()

def increment():
    global counter
    for _ in range(1000000):
        lock.acquire()
        try:
            counter += 1
        finally:
            lock.release()

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

for t in threads:
    t.join()

print(counter)

在上述代码中,通过lock.acquire()获取锁,try - finally块确保无论操作是否成功,锁都会被释放,这样就保证了对counter的操作是线程安全的。