MST

星途 面试题库

面试题:Python中threading模块如何实现线程同步?

请简述Python的threading模块里用于线程同步的常用机制,并举例说明如何使用锁(Lock)来避免多线程访问共享资源时的数据冲突。
23.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python的threading模块里用于线程同步的常用机制:

  1. 锁(Lock):用于控制对共享资源的访问,同一时间只有一个线程能获取锁并访问资源,其他线程需等待锁被释放。
  2. 信号量(Semaphore):控制同时访问共享资源的线程数量,它维护一个内部计数器,每次获取信号量计数器减1,释放信号量计数器加1,当计数器为0时,其他线程无法获取信号量。
  3. 事件(Event):线程间通过事件对象来传递信号,一个线程可以等待事件发生(通过wait()方法),另一个线程可以设置事件(通过set()方法),从而实现线程同步。
  4. 条件变量(Condition):通常与锁一起使用,允许线程在满足特定条件时等待,在条件满足时唤醒等待的线程。

使用锁(Lock)避免多线程访问共享资源时的数据冲突示例:

import threading

# 共享资源
counter = 0
# 创建锁对象
lock = threading.Lock()


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


# 创建两个线程
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)

# 启动线程
thread1.start()
thread2.start()

# 等待线程执行完毕
thread1.join()
thread2.join()

print(f"Final counter value: {counter}")

在上述代码中,lock.acquire()获取锁,确保同一时间只有一个线程能执行counter += 1这一操作,try-finally块保证无论在执行counter += 1时是否发生异常,锁都会被正确释放,从而避免多线程访问共享资源counter时的数据冲突。