Python 如何停止运行代码(包括线程)的终端进程?
我使用线程同时运行多个函数,目的是从多个网站中提取天气数据。我通过Linux终端运行了这些程序,但是我无法通过按ctrl C来取消它们。我想让它们无限期地运行,因此不想添加完成时间,而是在必要时取消它们。有人知道ctrl C为什么不取消它们,以及如何解决这个问题吗Python 如何停止运行代码(包括线程)的终端进程?,python,linux,multithreading,Python,Linux,Multithreading,我使用线程同时运行多个函数,目的是从多个网站中提取天气数据。我通过Linux终端运行了这些程序,但是我无法通过按ctrl C来取消它们。我想让它们无限期地运行,因此不想添加完成时间,而是在必要时取消它们。有人知道ctrl C为什么不取消它们,以及如何解决这个问题吗 使用Ctrl+Break组合键 按Ctrl+Z。这不会停止程序,但会返回命令提示符。然后,执行ps-ax | grep*%program\u name%*。找到与yopu要停止的行对应的行。行中的第一个整数将是程序ID。执行kill-
Ctrl+Break
组合键Ctrl+Z
。这不会停止程序,但会返回命令提示符。然后,执行ps-ax | grep*%program\u name%*
。找到与yopu要停止的行对应的行。行中的第一个整数将是程序ID。执行kill-9%ID%
以最终停止它李>
top
命令来更快地查看ID李>
守护进程线程
简单地使用守护进程线程来解决这个问题可能很有诱惑力,当只剩下守护进程线程时,python执行将停止,并且不会允许它们很好地清理。请明确指出:
守护进程线程在关闭时突然停止。他们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果希望线程正常停止,请将其设为非守护线程,并使用适当的信号机制,如事件
让我们按照他们的建议,使用一个事件
使用事件
事件是可以跨线程安全地设置和读取的简单标志。在本例中,我们将在主线程中创建一个事件,生成一个新线程来执行一些工作,并侦听该事件标志,以防它停止工作
import threading
ended = threading.Event()
def do_work():
while not ended.is_set():
# Do your repeated work
pass
# Let's create and start our worker thread!
new_thread = threading.Thread(target=do_work)
new_thread.start()
try:
while not ended.is_set():
ended.wait(1)
except (KeyboardInterrupt, SystemExit):
print("Cancelling")
ended.set()
这里的try/catch块在主线程中运行,侦听
键盘中断
或系统退出
异常。如果它捕捉到一个循环,它将设置stopped
标志,允许线程完成其当前循环迭代,并执行它需要的任何清理。1。Ctrl+Break不起作用。2.可能是有效的(我对linux比较陌生,在终端中工作,并试图找出问题),但是我试图将收集到的数据写入一个文本文件,这会导致数据丢失。虽然从技术上讲,这是结束python程序的一种有效方式,但使用kill-9
并不是一种优雅的结束方式。还有更好的选择。