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

时间:2017-06-30 18:15:34

标签: python linux multithreading

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

2 个答案:

答案 0 :(得分:3)

守护程序线程

简单地使用守护程序线程来解决这个问题可能很诱人,当只剩下 守护程序线程时,python执行将停止,允许它们清除很好。 The docs明确地说出来:

  

守护程序线程在关闭时突然停止。他们的资源(例如打开文件,数据库事务等)可能无法正确发布。如果您希望线程正常停止,请使它们成为非守护进程并使用合适的信号机制,例如事件。

让我们按照他们的建议使用活动。

使用活动

事件是一个简单的标志,可以安全地跨线程设置和读取。在这种情况下,我们将在主线程中创建一个事件,生成一个新线程来完成一些工作,并在它应该停止工作的情况下监听该事件标志。

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块在主线程中运行,侦听KeyboardInterruptSystemExit异常。如果它捕获一个,它将设置stopped标志,允许线程完成其当前循环迭代,并执行它所需的任何清理。

答案 1 :(得分:1)

  1. 使用Ctrl + Break键组合。
  2. Ctrl + Z。这不会停止程序,但会返回命令提示符。然后,做ps -ax | grep *%program_name%*。找到对应于想要停止的一个yopu的行。行中的第一个整数将是程序ID。请kill -9 %id%最终阻止它。
  3. 如果程序也占用了大量资源,您可以在单独的终端中使用top命令来更快地查看ID。
  4. Reference

相关问题