在 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 或任务,我无法这样做。有没有办法让我删除或停止我使用任何可能的方式创建的线程?我不在乎这样做是不是不好或混乱,我只是希望它停止。
我建议如下:
- 在你的 newTask.init 函数中,添加一行 "self.alive = True"
- 在set_timeout函数中,将"while True:"替换为"while v.alive:"
- 将 newTask 对象存储在 "tasks" 字典中,而不是线程对象。
- 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()
以下代码:
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 或任务,我无法这样做。有没有办法让我删除或停止我使用任何可能的方式创建的线程?我不在乎这样做是不是不好或混乱,我只是希望它停止。
我建议如下:
- 在你的 newTask.init 函数中,添加一行 "self.alive = True"
- 在set_timeout函数中,将"while True:"替换为"while v.alive:"
- 将 newTask 对象存储在 "tasks" 字典中,而不是线程对象。
- 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()