Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法中断lock.acquire(),而我可以中断time.sleep()_Python_Windows_Keyboard Events - Fatal编程技术网

Python 无法中断lock.acquire(),而我可以中断time.sleep()

Python 无法中断lock.acquire(),而我可以中断time.sleep(),python,windows,keyboard-events,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问题/答案,但效果很好) 两者都依赖于操作系统调用,那么为什么它不适用于锁,而适用于睡眠呢?这是因为time.sleep(1000000)大致相当于

在windows中,python 3.4

import threading
l = threading.Lock()
l.acquire()
l.acquire()
触发死锁,CTRL+C无法阻止它。你必须终止这个过程

另一方面:

import time
time.sleep(100000)
可以随时使用CTRL+C中断(我已经阅读了其他一些SO问题/答案,但效果很好)


两者都依赖于操作系统调用,那么为什么它不适用于锁,而适用于睡眠呢?这是因为
time.sleep(1000000)
大致相当于
范围内的i(10000000):time.sleep(0.1)
,因此可以很好地中断吗?

我找到了一种解决方法,它需要线程,并且主程序需要线程

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

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

它可以适应主线程的其他关键资源(套接字)

time.sleep
等待信号处理程序设置的Windows事件。最新3.6测试版中的事件CPython不支持等待此事件。