N秒后如何杀死线程?

路易斯·佩德罗·弗朗西斯卡托·瓜拉

我想创建将向数组中添加内容的线程,但是,如果它们在不到2秒钟内没有这样做,我想终止它们。

这是一个概念证明,因此代码很简单。我希望线程每秒钟将其添加到列表中,因此线程在0、1、2、3和4秒后运行。想法是不要让线程3和4运行。

import threading, time

myList = []

def foo(value):
    global myList
    time.sleep(value)
    print("Value: {}".format(value))
    myList.append(value)

threads = []

for i in range(5):
    th = threading.Thread(target=foo, args=(i,))
    threads.append(th)

for th in threads:
    th.start()

现在我该怎么做?我尝试使用其他一些逻辑,例如使用

th.join(timeout)

但这似乎不起作用。

马蒂诺

正如我在评论中所说,您不能真正(外部)“杀死”线程。但是,他们可以通过返回或提出例外情况“自杀”。

下面是当线程的执行时间超过给定时间时执行后者的示例。请注意,这与进行join(timeout)调用不同,后者仅在线程结束或经过指定的时间后才阻塞。因此value,无论线程是否在调用join()超时之前完成,都将打印和附加到列表

sys.settrace()从标题为“杀死线程的不同方法”的教程中获得了使用的基本思想,尽管我的实现略有不同。还要注意,这种方法可能会引入大量开销。

import sys
import threading
import time


class TimelimitedThread(threading.Thread):
    def __init__(self, *args, time_limit, **kwargs):
        self.time_limit = time_limit
        self._run_backup = self.run  # Save superclass run() method.
        self.run = self._run  # Change it to custom version.
        super().__init__(*args, **kwargs)

    def _run(self):
        self.start_time = time.time()
        sys.settrace(self.globaltrace)
        self._run_backup()  # Call superclass run().
        self.run = self._run_backup  # Restore original.

    def globaltrace(self, frame, event, arg):
        return self.localtrace if event == 'call' else None

    def localtrace(self, frame, event, arg):
        if(event == 'line' and
           time.time()-self.start_time > self.time_limit):  # Over time?
            raise SystemExit()  # Terminate thread.
        return self.localtrace


THREAD_TIME_LIMIT = 2.1  # Secs
threads = []
my_list = []

def foo(value):
    global my_list
    time.sleep(value)
    print("Value: {}".format(value))
    my_list.append(value)

for i in range(5):
    th = TimelimitedThread(target=foo, args=(i,), time_limit=THREAD_TIME_LIMIT)
    threads.append(th)

for th in threads:
    th.start()

for th in threads:
    th.join()

print('\nResults:')
print('my_list:', my_list)

输出:

Value: 0
Value: 1
Value: 2

Results:
my_list: [0, 1, 2]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

杀死线程后如何分配内存?

来自分类Dev

1.5秒后如何显示图像并杀死它?

来自分类Dev

关闭项目后线程仍然退出,如何将其杀死?

来自分类Dev

如何杀死这个线程?

来自分类Dev

如何杀死线程池中的线程?

来自分类Dev

如何杀死进程的特定线程?

来自分类Dev

如何使用python杀死线程

来自分类Dev

如何杀死父线程池?

来自分类Dev

如何在n秒后停用MutationsObserver?

来自分类Dev

如何从父线程杀死子线程-C

来自分类Dev

60秒后以最简单的方式杀死Python脚本

来自分类Java

如何杀死一个java线程?

来自分类Dev

如何杀死正在运行的线程

来自分类Java

您如何杀死Java中的线程?

来自分类Dev

如何杀死由条件变量锁定的线程?

来自分类Java

如何杀死具有“繁忙”线程的threadPoolExecutor?

来自分类Java

如何杀死Java中的死锁线程?

来自分类Dev

如何杀死所有线程?

来自分类Dev

如果线程遇到异常,如何杀死进程?

来自分类Dev

如何杀死由子线程启动的进程?

来自分类Dev

如何立即杀死所有线程

来自分类Dev

如何在 n 秒后打印一些东西?

来自分类Java

`ThreadPoolTaskExecutor`线程在春季执行后没有被杀死

来自分类Java

在Java中指定的时间限制后杀死线程

来自分类Java

Java 8:在一定时间后杀死/停止线程

来自分类Linux

对于pthread,如何从主线程中杀死子线程

来自分类Dev

如何杀死不是主线程的所有线程?

来自分类Dev

如何杀死球拍中的线?杀死线程继续使用“ proc”而不是线程

来自分类Dev

X时间后如何杀死Akka演员?