当前位置: 首页 > 面试题库 >

一段时间后杀死线程的大多数Python方法

邹开畅
2023-03-14
问题内容

我想在线程中运行一个进程(正在对一个大的数据库表进行迭代)。在线程运行时,我只希望程序等待。如果该线程花费的时间超过30秒,我想终止该线程并执行其他操作。通过杀死线程,我的意思是我希望它停止活动并优雅地释放资源。

我想这样做是通过最好的方式Thread()join(delay)is_alive()功能,以及Event。使用join(delay)I,我可以让我的程序等待30秒等待线程完成,并且通过使用该is_alive()函数,我可以确定线程是否完成了工作。如果尚未完成工作,则设置事件,并且线程知道在该点停止工作。

这种方法有效吗,这是解决我的问题陈述的最有效的方法吗?

这是一些示例代码:

import threading
import time

# The worker loops for about 1 minute adding numbers to a set
# unless the event is set, at which point it breaks the loop and terminates
def worker(e):
    data = set()
    for i in range(60):
        data.add(i)
        if not e.isSet():
            print "foo"
            time.sleep(1)
        else:
            print "bar"
            break

e = threading.Event()
t = threading.Thread(target=worker, args=(e,))
t.start()

# wait 30 seconds for the thread to finish its work
t.join(30)
if t.is_alive():
    print "thread is not done, setting event to kill thread."
    e.set()
else:
    print "thread has already finished."

问题答案:

在这种情况下,使用事件作为信号传递机制就可以了,实际上在线程模块docs中建议使用。

如果您希望线程正常停止,请使其成为非守护进程,并使用适当的信号传递机制,例如Event

验证线程终止时,超时几乎总是会引入错误空间。因此,虽然将.join()with超时用于触发事件的初始决策是可以的,但最终验证应使用.join()没有超时的a
进行。

# wait 30 seconds for the thread to finish its work
t.join(30)
if t.is_alive():
    print "thread is not done, setting event to kill thread."
    e.set()
    # The thread can still be running at this point. For example, if the 
    # thread's call to isSet() returns right before this call to set(), then
    # the thread will still perform the full 1 second sleep and the rest of 
    # the loop before finally stopping.
else:
    print "thread has already finished."

# Thread can still be alive at this point. Do another join without a timeout 
# to verify thread shutdown.
t.join()

可以简化为以下形式:

# Wait for at most 30 seconds for the thread to complete.
t.join(30)

# Always signal the event. Whether the thread has already finished or not, 
# the result will be the same.
e.set()

# Now join without a timeout knowing that the thread is either already 
# finished or will finish "soon."
t.join()


 类似资料:
  • 本文向大家介绍python杀死一个线程的方法,包括了python杀死一个线程的方法的使用技巧和注意事项,需要的朋友参考一下 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一个端口,远程读取文件等,但是我给的时间有限,比如,4秒钟如果你还没有读取完成或者连接成功,我就不等了,很可能对方已经宕机或者拒绝了。这样可以批量做一些事情而不需要一直等,浪费时间。 结合我的需求,我想到这种办法:

  • 我对线程非常陌生,在代码中使用线程时,我面临以下问题。 点击一个按钮,我就启动了一个运行特定任务的线程,这个任务在系统的后台运行。我在线程中使用了一个while循环来检查一个易失性bool是否被另一个按钮点击来停止整个过程而改变。问题是我必须添加一个空循环,否则它看起来就像线程停止自己,不再检查while条件。我认为这是非常低效的,浪费了很多资源。 我添加了一个简短的代码版本,以减少不可读性。 你

  • 问题内容: 在Java中指定的时间限制后,有没有办法杀死子线程?编辑:此特定线程也可能在最坏的情况下被阻止(线程用于等待文件修改并在发生此事件之前被阻止),所以我不确定中断()是否会成功? 问题答案: 利用来执行,签出你可以指定超时的方法。例如 当然在这里实施。

  • 我想使用执行器接口(使用Callable),以便启动一个线程(让我们称之为可调用线程),它将执行使用阻塞方法的工作。这意味着当主线程调用Future.cancel(true)(调用Thread.interrupt())时,可调用的线程可以抛出一个InterruptedExc0019。 我还希望我的可调用线程在代码的取消部分使用其他阻塞方法中断时正确终止。 在实现这一点时,我经历了以下行为:当我调用

  • 问题内容: 我正在python中使用subprocess模块​​运行一些shell脚本。如果shell脚本运行时间很长,我想杀死该子进程。我认为如果将其传递给我的陈述就足够了。 这是代码: 我已经用一些运行120秒的shell脚本测试了此调用。我期望子进程在30秒后被杀死,但是实际上该进程正在完成120秒脚本,然后引发了Timeout Exception。现在的问题是如何通过超时杀死子进程? 问题

  • 问题内容: 我需要制作一个从用户获取以下内容的脚本: 1)进程名称(在Linux上)。 2)此进程写入的日志文件名。 它需要终止该进程并确认该进程已关闭。将日志文件名更改为带有时间和日期的新文件名。然后再次运行该过程,确认它已启动,以便继续写入日志文件。 先谢谢您的帮助。 问题答案: 您可以使用以下命令检索给定名称的进程ID(PID): 希望这可以帮助