Python 如何停止运行代码(包括线程)的终端进程?

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-

我使用线程同时运行多个函数,目的是从多个网站中提取天气数据。我通过Linux终端运行了这些程序,但是我无法通过按ctrl C来取消它们。我想让它们无限期地运行,因此不想添加完成时间,而是在必要时取消它们。有人知道ctrl C为什么不取消它们,以及如何解决这个问题吗

  • 使用
    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
    并不是一种优雅的结束方式。还有更好的选择。