不能中断lock.acquire()而我可以中断time.sleep()

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

标签: python windows keyboard-events

在windows中,python 3.4

import threading
l = threading.Lock()
l.acquire()
l.acquire()

触发死锁,CTRL + C无法阻止它。你必须杀死这个过程。

另一方面:

import time
time.sleep(100000)
使用CTRL + C可以随时中断

(我已经在其他一些SO问题/答案上阅读了其他问题但答案正常)

两者都依赖于OS系统调用,为什么它不适用于锁,它适用于sleep?是因为time.sleep(1000000)(大致)等同于for i in range(10000000): time.sleep(0.1),因此可以被中断吗?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方法,需要一个线程,主要程序cooperates和线程。

让我们考虑一下这个程序:

import threading

l = threading.Lock()
l.acquire()
l.acquire()

该程序阻塞并且不能被CTRL + C中断。你必须杀死这个过程。

现在,我正在创建一个使用线程锁执行阻塞调用的线程。当按下CTRL + C时,我中断程序并释放锁定。

除了与之合作之外,没有办法杀死线程,所以你必须知道线程在做什么:

import threading
import time,sys

l = threading.Lock()

def run():
    global l
    l.acquire()
    l.acquire()

t = threading.Thread(target=run)
t.start()

while True:
    try:
        time.sleep(1)
    except KeyboardInterrupt:
        print("quitting")
        l.release()
        break

可以适应其他关键资源(套接字)