为什么多线程有一个Lock对象?

时间:2016-10-31 09:09:17

标签: python multithreading

我的理解是threading实际上允许一次仅激活一个线程,在线程之间不断切换。这在使用IO绑定操作时很有用,其中worload在其他地方有效卸载(PI,数据库......)。

如果是这样,为什么需要Lock()对象?两个线程同时访问变量没有风险(多处理可能就是这种情况)所以我在这种情况下没有看到锁的真正用法。

2 个答案:

答案 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