Python线程脚本启动/工作不正常

2024-09-26 18:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我很快就为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)。如何使此脚本正确运行并在提示时退出?


Tags: fromimport脚本true示例ifmaindef
2条回答

标记为daemon的线程在每一个其他非守护进程线程死亡时自动死亡。在您的例子中,主线程在您的两个守护进程线程上调用start()之后就死了,带来了python进程。在你的线程中完成任何事情都是运气和时间的问题。

sys.exit(0)不会终止主线程以外的线程。你需要一种方法来向你的线程发出停止的信号。一种方法是通过Event对象。

不应使用getch来尝试捕获Ctrl+C,请尝试使用信号处理程序:

from threading import Thread
from threading import Event
from time import sleep
import signal

stop = Event()

def handler(signum, frame):
    y = raw_input("Are you sure you want to quit? (y/n): ").lower()
    if y == 'y':
        stop.set()

def main():
    t = 0
    while not stop.isSet():
        print "The count is {0}".format(t)
        t +=1
        sleep(1)

if __name__ == "__main__":
    signal.signal(signal.SIGINT, handler)

    mainthread = Thread(target = main)
    mainthread.start()

    while mainthread.is_alive():
        try:
            mainthread.join(timeout = 0.1)
        except IOError:
            pass #Gets thrown when we interrupt the join

你有两个问题。首先,你的程序结束得太早了。第二个是尝试退出KeyEvent线程中的程序。

你的程序提前终止,因为你没有保留主线程。主线程在最后一条语句kev.start()之后结束,守护进程线程随之死亡。

您需要一种机制无限地保持主线程(因为您希望用户键入“y”退出)。一个是加法

mainthread.join()

直到你的代码结束。

其次,KeyEvent线程中的sys.exit(0)显然不能终止整个程序。请在下面的帖子中找到您的答案:Why does sys.exit() not exit when called inside a thread in Python?

相关问题 更多 >

    热门问题