在 python 中停止 threading.Thread

stop a threading.Thread in python

以下代码:

import time
import threading
tasks = dict()

class newTask(object):

    def __init__(self, **kw):
        [setattr(self, x, kw[x]) for x in kw]
        self.object_ret()

    def object_ret(self): return self

def task_create(name, timeout, function):
    task = newTask(**{
        'timeout': int(timeout),
        'function': function,
        'start': time.time()
        })
    def set_timeout(v):
        while True:
            if (time.time() - v.start) > v.timeout:
                v.function()
                v.start = time.time()
    tasks[name] = threading.Thread(target=set_timeout, args=(task,))
    tasks[name].start()

def stop(x):
    #stops the thread in tasks[x]

是一个简单的任务系统,我用它来处理诸如 ping 和超时之类的小任务。这适用于我的需要,但如果我想停止 运行 的 ping 或任务,我无法这样做。有没有办法让我删除或停止我使用任何可能的方式创建的线程?我不在乎这样做是不是不好或混乱,我只是希望它停止。

我建议如下:

  1. 在你的 newTask.init 函数中,添加一行 "self.alive = True"
  2. 在set_timeout函数中,将"while True:"替换为"while v.alive:"
  3. 将 newTask 对象存储在 "tasks" 字典中,而不是线程对象。
  4. stop(x)函数只有一行:"tasks[x].alive = False"

这将导致线程在您调用 stop(x) 时终止,其中 x 是线程的名称。它提供了一种机制,允许线程在不以某种虚假方式终止的情况下终止。我知道你说过你不在乎,但你真的应该关心你是否想让你的多线程程序工作。

第二条建议:认真阅读Ulrich Eckhardt的评论,认真对待;他的所有观点都被采纳了。

信号处理程序:::

def signal_handler(signal, frame):
  print('You pressed Ctrl+C!')
  tasks[name].stop()
  sys.exit(0)

在主脚本中,注册handler:::

signal.signal(signal.SIGINT, signal_handler)
signal.pause()