使用操作系统杀死python线程

使用操作系统杀死python线程,python,linux,multithreading,Python,Linux,Multithreading,我已经多次问过类似的问题,但仍然找不到合适的解决方案 我有和外部功能,在某些情况下可以运行很长时间。我想在30秒后打断它 我该怎么做 线程是好的,但我无法阻止它们(我无法访问外部函数的代码) 多处理也不是一个选项,因为我在mod_wsgi下运行站点 有没有可靠的方法来停止线程? 可能使用os.system或os.kill。如果是的话,怎么办 外部函数只执行一些计算,没有网络连接或文件打开。所以,我只需要停止这个过程并清理一下 我的代码(实际上是从某些源代码中获取的): 不,无法从外部停止线程。一

我已经多次问过类似的问题,但仍然找不到合适的解决方案

我有和外部功能,在某些情况下可以运行很长时间。我想在30秒后打断它

我该怎么做

  • 线程是好的,但我无法阻止它们(我无法访问外部函数的代码)
  • 多处理也不是一个选项,因为我在mod_wsgi下运行站点
  • 有没有可靠的方法来停止线程? 可能使用os.system或os.kill。如果是的话,怎么办

    外部函数只执行一些计算,没有网络连接或文件打开。所以,我只需要停止这个过程并清理一下

    我的代码(实际上是从某些源代码中获取的):


    不,无法从外部停止线程。一个线程完全控制着产生它的进程,从外部杀死它意味着你必须弄乱进程内存,这通常意味着你使进程无法正常工作;您通常要做的是以某种形式处理消息,允许线程在某些外部脉冲下自行终止。

    这可能不是终止线程的最佳方法,但提供了终止线程的方法。请注意,您可能还需要实现一种方法,使线程在其代码的关键部分不可修改


    为方便起见,下面提供了代码和用法示例:

    import threading
    import sys
    
    class StopThread(StopIteration): pass
    
    threading.SystemExit = SystemExit, StopThread
    
    class Thread2(threading.Thread):
    
        def stop(self):
            self.__stop = True
    
        def _bootstrap(self):
            if threading._trace_hook is not None:
                raise ValueError('Cannot run thread with tracing!')
            self.__stop = False
            sys.settrace(self.__trace)
            super()._bootstrap()
    
        def __trace(self, frame, event, arg):
            if self.__stop:
                raise StopThread()
            return self.__trace
    
    
    class Thread3(threading.Thread):
    
        def _bootstrap(self, stop_thread=False):
            def stop():
                nonlocal stop_thread
                stop_thread = True
            self.stop = stop
    
            def tracer(*_):
                if stop_thread:
                    raise StopThread()
                return tracer
            sys.settrace(tracer)
            super()._bootstrap()
    
    ################################################################################
    
    import time
    
    def main():
        test = Thread2(target=printer)
        test.start()
        time.sleep(1)
        test.stop()
        test.join()
    
    def printer():
        while True:
            print(time.time() % 1)
            time.sleep(0.1)
    
    if __name__ == '__main__':
        main()
    

    Thread3
    类运行代码的速度似乎比
    Thread2
    类快约33%。

    您可以使用操作系统执行终端命令。这将允许您从程序内部进行终端控制。如果你想

    import os
    os.system("terminal command goes here")
    
    对于linux,请阅读以下内容:

    查看
    pthread\u kill()

    对于windows:

    对于mac:

    或者:

    import signal
    signum = signal.getsignal(c)
    signal.siginterrupt(signum, flag)
    
    或:

    也可以设置一些定时器功能

    有关python线程的其他信息:
    您不能终止线程,但可以终止进程。如果可以使用进程而不是线程,则可以使用。进程可以来自父应用程序


    如果你能更详细地描述你的任务,也许我能帮上更多的忙。

    我看到了答案。它下面的代码慢得令人无法接受。@AndrewCount如果您可以在线程类中引入停止方法而不造成性能损失,请告诉我。我很想看到这个问题的最佳跨平台解决方案。我不是说,我不能接受一些缓慢,但代码永远在运行。@Andrewount你检查过吗?其中一个答案中列出的
    ThreadWithExc
    类似乎没有任何开销。似乎只需要使用
    ctypes
    的一点魔力。这正是现在实现的功能。唉,这并不总是会扼杀线程。不可能。线程不能被杀死。这是一个过程的内部事物,没有清晰的、定义明确的交互方式。基本上,你的线程必须愿意自行终止。这个问题的其他答案呢?你觉得怎么样?@Andrewount:castaway2000的答案根本不涉及线程,而是进程。Noctis的答案基本上是添加一个始终允许您在线程上下文中调用线程的stop方法的点,这无异于添加一种非常缓慢的方式让线程自行停止。您接受的答案是我所说的,但是没有关于为什么不能终止线程的信息,所以我有点难过您选择了那个。@Andrewount:对不起,您不是真的理解。您能提供一个linux的小片段吗?我不知道如何获取线程id以及在linux中使用什么命令?您需要自己程序的线程还是外部程序的线程?
    pthread_kill()
    也可能值得在这里签出此线程:您想从终端使用
    pidof
    import signal
    signum = signal.getsignal(c)
    signal.siginterrupt(signum, flag)
    
    import os
    sigID = c.get_ident 
    os.system("kill -SIGKILL " + sigID)