python - 无法中断 lock.acquire() 而我可以中断 time.sleep()

标签 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 问题/答案,但效果很好)

两者都依赖于操作系统系统调用,那么为什么它不能用于锁而可以用于 sleep ?是因为 time.sleep(1000000) (大致)相当于 for i in range(10000000): time.sleep(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

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

关于python - 无法中断 lock.acquire() 而我可以中断 time.sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545612/

相关文章:

python - 如何在 64 位 Windows 7 机器上安装 pycrypto?

Javascript,按键值总是落后于最新的一个字符?

c++ - 如何处理 wxWidgets 控制台应用程序中的关键事件?

python - 如何在 django 中加载自定义字段

python - 导入 google.cloud.datastore 时为 "ImportError: No module named pkg_resources"

python - 如何正确格式化要插入数据库的 StringIO 对象(python 和 django)?

java - 多个摄像头同时openimaj

windows - 2D 跨平台游戏开发引擎

python - 限制/阻止 Python 中输入的按键并防止在下一个提示中出现键盘按键

python - 找到使用 houghlines opencv 绘制的两条线的交点