【问题标题】:cannot interrupt lock.acquire() whereas I can interrupt time.sleep()不能中断 lock.acquire() 而我可以中断 time.sleep()
【发布时间】:2016-09-17 10:16:16
【问题描述】:

在 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),因此可以被很好地中断吗?

【问题讨论】:

  • 对于主线程,time.sleep 等待由信号处理程序设置的 Windows 事件。在 CPython 中不一致地支持等待此事件,最新 3.6 beta 中的事件。

标签: python windows keyboard-events


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2017-10-09
    • 1970-01-01
    • 2020-04-13
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多