我很快就为stackoverflow编写了这个示例脚本,所以忽略它的功能方面(我的版本看起来比这个好很多),但是:
from threading import Thread
from msvcrt import getch #I'm using Windows by the way.
from time import sleep
import sys
def KeyEvent():
while True:
key = getch()
if key.encode('hex') == '03': #^C
y = raw_input("Are you sure you want to quit? (y/n): ").lower()
if y == 'y':
sys.exit(0)
else: pass
def main():
t = 0
while True:
print "The count is {0}".format(t)
t +=1
sleep(1)
if __name__ == "__main__":
mainthread = Thread(target = main)
kev = Thread(target = KeyEvent)
mainthread.daemon = True
kev.daemon = True
mainthread.start()
kev.start()
这个脚本要做的是同时运行两个循环,一个循环以秒计,另一个循环检查^C。请不要建议我使用其他方法,因为这是一个示例。
我的问题是,剧本还没开始。它显示“计数为0”并退出,但如果我完全忽略了.daemon = True
部分,则脚本将运行,但它不会正确运行sys.exit(0)
。如何使此脚本正确运行并在提示时退出?
标记为
daemon
的线程在每一个其他非守护进程线程死亡时自动死亡。在您的例子中,主线程在您的两个守护进程线程上调用start()
之后就死了,带来了python进程。在你的线程中完成任何事情都是运气和时间的问题。sys.exit(0)
不会终止主线程以外的线程。你需要一种方法来向你的线程发出停止的信号。一种方法是通过Event对象。不应使用
getch
来尝试捕获Ctrl+C,请尝试使用信号处理程序:你有两个问题。首先,你的程序结束得太早了。第二个是尝试退出KeyEvent线程中的程序。
你的程序提前终止,因为你没有保留主线程。主线程在最后一条语句kev.start()之后结束,守护进程线程随之死亡。
您需要一种机制无限地保持主线程(因为您希望用户键入“y”退出)。一个是加法
mainthread.join()
直到你的代码结束。
其次,KeyEvent线程中的sys.exit(0)显然不能终止整个程序。请在下面的帖子中找到您的答案:Why does sys.exit() not exit when called inside a thread in Python?
相关问题 更多 >
编程相关推荐