Python 3.x 线程锁引起的无限循环

Python 3.x 线程锁引起的无限循环,python-3.x,multithreading,infinite-loop,python-multithreading,locks,Python 3.x,Multithreading,Infinite Loop,Python Multithreading,Locks,我写了一个非常简单的代码来模拟我最近遇到的情况。但我不太明白为什么会发生这种情况。谁能详细解释一下由于使用锁而产生无限循环的原因呢 测试代码(模拟条件) 输出 Lock Acquired <cursor-blinking> 有人能解释为什么这种天性是后天习得的吗?如果线程不知道它拥有锁的控制权,并且应该继续执行代码?当您使用continue时,将跳过循环体的进一步处理,并将控件移回循环的顶部,即循环条件(在您的情况下为而为True:) 一旦循环体再次开始执行,它将尝试获取在循环的

我写了一个非常简单的代码来模拟我最近遇到的情况。但我不太明白为什么会发生这种情况。谁能详细解释一下由于使用锁而产生无限循环的原因呢

测试代码(模拟条件)

输出

Lock Acquired
<cursor-blinking>


有人能解释为什么这种天性是后天习得的吗?如果线程不知道它拥有锁的控制权,并且应该继续执行代码?

当您使用
continue
时,将跳过循环体的进一步处理,并将控件移回循环的顶部,即循环条件(在您的情况下为
而为True:

一旦循环体再次开始执行,它将尝试获取在循环的上一次迭代中已经获取的锁。因此,您的线程将永远阻塞,因为锁永远不会被释放,就像在给定的示例中,我们永远不会到达释放锁的循环部分。这将导致死锁情况,导致代码的执行暂停

值得注意的是,线程还不够聪明,无法意识到它们正在获取一个在早些时候已经获取的锁,尽管可以编写一个包装器来保存锁和获取它们的线程的映射,以防止出现这种情况


您的第二个解决方案确实解决了死锁问题。

这正是我最初认为线程必须知道是否是它们获得了锁的原因。
Lock Acquired
<cursor-blinking>

import threading


# Declare Lock
jobs_lock = threading.Lock()


while True:

    # Acquire the Lock
    jobs_lock.acquire()

    print("Lock Acquired")

    if 1:
        jobs_lock.release()
        continue
    else:
        print("useless else")

    jobs_lock.release()