Python中的互斥锁

当存在竞争资源的行为时,最好是加上锁,否则可能导致资源的混乱,下面来看一个例子:

import threading

lock = threading.Lock()
alist = []

def with_lock(n):
    lock.acquire()
    alist.append(n)
    print(alist)
    lock.release()


def without_lock(n):
    alist.append(n)
    print(alist)


for i in range(0,10):
    tar = threading.Thread(target=without_lock, args=(i,))
    tar.start()

上面的代码分别为加锁,和不加锁的情况下向列表alist中添加元素,它们最终的目的都是向alist中添加了10个元素,但在过程我我们打印alist分别得到下面的结果:

# with lock
[0]
[0, 2]
[0, 2, 1]
[0, 2, 1, 3]
[0, 2, 1, 3, 4]
[0, 2, 1, 3, 4, 5]
[0, 2, 1, 3, 4, 5, 6]
[0, 2, 1, 3, 4, 5, 6, 7]
[0, 2, 1, 3, 4, 5, 6, 7, 8]
[0, 2, 1, 3, 4, 5, 6, 7, 8, 9]

# without lock
[0]
[0, 1]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]

为什么会出现这种情况呢,因为在我们打印的过程中可能存在读和写的操作.所以当可能存在这种情况时最好加上锁

上一篇:先见其化

下一篇:Python中两种约束