繁体   English   中英

如何停止这个正在运行的threading.Thread?

[英]How to stop this running threading.Thread?

我在堆栈溢出中发现了这个非阻塞代码,它使用线程在 JavaScript 中提供非阻塞 setInterval 函数的功能 但是当我尝试停止该过程时,它甚至 Ctrl + C 都没有停止它,我尝试了更多方法来停止该过程,但它们不起作用。 有人可以告诉一个正确的方法来停止这个过程,提前谢谢你。

这是代码

import threading

class ThreadJob(threading.Thread):
    def __init__(self,callback,event,interval):
        '''runs the callback function after interval seconds

        :param callback:  callback function to invoke
        :param event: external event for controlling the update operation
        :param interval: time in seconds after which are required to fire the callback
        :type callback: function
        :type interval: int
        '''
        self.callback = callback
        self.event = event
        self.interval = interval
        super(ThreadJob,self).__init__()

    def run(self):
        while not self.event.wait(self.interval):
            self.callback()



event = threading.Event()

def foo():
    print ("hello")

def boo():
    print ("fello")



def run():
    try:
        k = ThreadJob(foo,event,2)
        d = ThreadJob(boo,event,6)
        k.start()
        d.start()
        while 1:
            falg = input("Press q to quit")
            if(falg == 'q'):
                quit()
                return 
    except KeyboardInterrupt:
        print('Stoping the script...')         
    except Exception as e:
        print(e)

run()
print( "It is non-blocking")

您需要做的就是替换这一行:

quit()

有了这个:

event.set()

如果有线程仍在运行,Python 程序将不会退出,因此 quit() 函数没有做任何事情。 一旦设置了事件的内部标志,线程将退出它们的 while 循环,因此对 event.set() 的调用将导致您创建的两个额外线程的终止。 然后程序将退出。

注意:从技术上讲,您可以将线程设置为“守护进程”,然后它们不会使程序保持活动状态。 但我认为这不是正确的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM