我的理解是threading实际上允许一次仅激活一个线程,在线程之间不断切换。这在使用IO绑定操作时很有用,其中worload在其他地方有效卸载(PI,数据库......)。
如果是这样,为什么需要Lock()对象?两个线程同时访问变量没有风险(多处理可能就是这种情况)所以我在这种情况下没有看到锁的真正用法。
答案 0 :(得分:3)
两个线程同时访问变量没有风险
这取决于用于实现多线程的调度程序。无论当前线程做什么,都可以在任何中断上进行上下文切换。因此,访问变量的线程可能会在时钟中断中被中断,并且可能会激活访问同一变量的另一个线程。
答案 1 :(得分:2)
首先,锁定保护整个区域,考虑更新文件:
with lock:
with open("some_file", "r+") as f:
do_something(f)
即使是单一的操作,如
a['b'] += 1
可能导致多个操作(读取值a['b']
,增量,写入a['b']
),并且需要通过锁保护:
with lock:
a['b'] += 1