[英]cannot interrupt lock.acquire() whereas I can interrupt time.sleep()
在 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)
,因此可以很好地中断?
我找到了一个解决方法,它需要一个线程并且主程序与线程合作。
让我们考虑这个程序:
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
可以适应其他关键资源(套接字)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.