停止一个threading.Thread在python中

时间:2015-01-13 21:43:22

标签: python multithreading task

以下代码:

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或任务,我就无法这样做。有没有办法让我删除或停止使用任何可能的方式创建的线程?我不在乎这样做是不是坏事还是凌乱,我只是想让它停止。

2 个答案:

答案 0 :(得分:2)

我建议如下:

  1. 在你的newTask。 init 函数中,添加一行“self.alive = True”
  2. 在set_timeout函数中,将“while True:”替换为“while v.alive:”
  3. 将newTask对象存储在“tasks”字典中,而不是线程对象。
  4. stop(x)函数有一行:“tasks [x] .alive = False”
  5. 这会导致线程在调用stop(x)时死亡,其中x是线程的名称。它提供了一种机制,允许线程死亡,而不会以某种虚假的方式杀死它。我知道你说你不在乎,但如果你想让你的多线程程序工作,你真的应该关心。

    第二个建议:仔细阅读Ulrich Eckhardt的评论并认真对待;所有他的观点都很好。

答案 1 :(得分:0)

信号处理程序:::

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

在主脚本中,注册处理程序:::

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