【问题标题】:stop a threading.Thread in python在python中停止threading.Thread
【发布时间】:2015-01-13 21:43:22
【问题描述】:

以下代码:

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

【问题讨论】:

  • 函数set_timeout是一个闭包,可以访问task和传递给task_create的参数。此外,创建一个字典,然后使用 ** 将其转换为命名函数参数,这会违背关键字参数的目标。调用仅返回 self 作为 __init__ 中的最后一个操作的函数也不会澄清您的代码。最后,busy-looping 在 CPU 方面非常昂贵。也就是说,您需要告诉您的线程终止,例如使用一个条件,然后等待它终止。您应该能够轻松地在网上找到示例。

标签: python multithreading task


【解决方案1】:

我建议如下:

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

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

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

【讨论】:

  • 其实做了类似这样的东西,找到了迂回的解决方案。
  • 这只是一个简单的 ping 系统,用于保持与几个客户端的连接,所以我认为如果一个线程被不正确地删除,这不会太重要。
【解决方案2】:

信号处理器:::

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2010-10-21
    • 2016-12-10
    • 2021-11-23
    相关资源
    最近更新 更多