面试题答案
一键面试Python的threading模块里用于线程同步的常用机制:
- 锁(Lock):用于控制对共享资源的访问,同一时间只有一个线程能获取锁并访问资源,其他线程需等待锁被释放。
- 信号量(Semaphore):控制同时访问共享资源的线程数量,它维护一个内部计数器,每次获取信号量计数器减1,释放信号量计数器加1,当计数器为0时,其他线程无法获取信号量。
- 事件(Event):线程间通过事件对象来传递信号,一个线程可以等待事件发生(通过
wait()
方法),另一个线程可以设置事件(通过set()
方法),从而实现线程同步。 - 条件变量(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
时的数据冲突。