首页 > 解决方案 > 当您无法访问启动线程的变量时,如何在 Python 中停止线程?

问题描述

在控制程序的主要 python 文件中,我有一个函数,它为作为参数传入的函数创建线程。

def NewThread(com, Returning: bool, thread_ID, *arguments) -> Any:
    """
    Will create a new thread for a function/command.
    :param com: Command to be Executed
    :param Returning: True/False Will the command return anything?
    :param thread_ID: Name of thread created
    :param arguments: Arguments to be sent to Command that is started in a thread
    """
    
    class NewThreadWorker(Thread):
        def __init__(self, group = None, target = None, name = None, args = (), kwargs = None, *,
                     daemon = None):
            Thread.__init__(self, group, target, name, args, kwargs, daemon = daemon)
            self.daemon = True
            self._return = None
        
        def run(self):
            if self._target is not None:
                self._return = self._target(*self._args, **self._kwargs)
        
        def join(self):
            Thread.join(self)
            return self._return
    
    ntw = NewThreadWorker(target = com, name = thread_ID, args = (*arguments,))
    if Returning:
        ntw.start()
        return ntw.join()
    else:
        ntw.start()

这个功能很好用,但是我无法与已创建的新线程进行交互。通常,您停止线程所要做的就是(在这种情况下)ntw.join() 但是我无法使用当前的设置来执行此操作。因此,经过多次试验和错误(很多很多错误)后,我想:为什么我不能将线程分配给一个新变量并在其上使用 .join() ?

所以,这让我想到了我的问题:

当您无权访问启动线程的变量(ntw在这种情况下)时,如何在 python3 中杀死一个线程?

如果可能的话,我想保留 NewThread 函数的设置。(我真的不想为我拥有的每个功能手动管理每个线程,那会非常痛苦)非常感谢任何帮助。

如果您想查看与之集成的项目的源代码在哪里,这里是 github 存储库:https ://github.com/vipersniper0501/CP_Scripts2/blob/dev/GUIs/ScriptRunnerPyQt5_GUI/ScriptGUIrunner.py

编辑:我看过有没有办法杀死一个线程?这并不能回答我的问题。

标签: pythonpython-3.xpython-multithreading

解决方案


推荐阅读