我正在使用线程同时运行多个功能,目的是从多个网站提取天气数据。我通过Linux终端运行这些程序,但是无法通过按ctrl C来取消它们。我想让它们无限期地运行,因此不想在完成时间内添加,而是宁愿必要时取消它们。有谁知道为什么ctrl C没有取消它们,以及如何解决这个问题?
答案 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块在主线程中运行,侦听KeyboardInterrupt
或SystemExit
异常。如果它捕获一个,它将设置stopped
标志,允许线程完成其当前循环迭代,并执行它所需的任何清理。
答案 1 :(得分:1)
Ctrl + Break
键组合。Ctrl + Z
。这不会停止程序,但会返回命令提示符。然后,做ps -ax | grep *%program_name%*
。找到对应于想要停止的一个yopu的行。行中的第一个整数将是程序ID。请kill -9 %id%
最终阻止它。 top
命令来更快地查看ID。