在运行多个线程的Python脚本中响应键盘中断退出的步骤
我有一个脚本,它会无限运行两个线程。(每个线程都是一个无限循环)每当我正常运行它时,我会用 ctrl + Z 或 ctrl + C 来停止它的执行(具体取决于操作系统)。但是自从我把它添加到 Linux 的 /etc/rc.local 文件中,以便在开机时自动启动后,我就无法使用这些命令强制退出了。
这让我不得不在 Python 脚本中加入一些东西,以便在我按下某个键时能够干净利落地退出。请问我该怎么做?
问题是我在运行一个多线程的应用程序,它会持续运行,并且不等待任何用户输入。
我在我的线程循环开始时加了这个:
ip = raw_input()
if ip == 'quit':
quit()
但这样做是行不通的,因为它会等待用户输入,从而阻止脚本继续运行。我不想让脚本受到任何影响。我只是希望它在我想停止时能够做出反应。我的问题不是用什么命令(这里有解释 - Python 退出命令 - 为什么有这么多,什么时候该用哪个?),而是我该如何使用它而不影响程序的正常运行。
2 个回答
要处理 KeyboardInterrupt
这个情况,可以通过发送一个 INT 信号来停止程序,具体命令是:kill -INT $pid
,这里的 $pid
是程序的进程 ID(PID)。这其实和在程序运行的终端按下 CTRL+C 是一样的。
在程序启动后立即把它的 PID 写入一个文件,不管是程序内部自己写的,还是从外部代码异步启动的,这样可以方便后续发送信号,不用再去进程列表里找这个进程。
一种方法是让线程在它们的循环中检查一个全局变量,当这个变量被设置时,就结束循环(也就是用break
跳出循环并终止)。
主线程可以简单地设置这个变量,然后在终止之前调用join()
来等待所有正在运行的线程结束。需要注意的是,如果某个线程在等待某个事件发生,这样它就不会立即检查全局变量是否被设置,那么它就会一直卡在那里,直到那个事件发生。